functor (X : sig type 'a t end->
  sig
    module Tag_internal :
      sig
        type ('variant, 'args) create =
            Args of ('args -> 'variant)
          | Const of 'variant
        type ('variant, 'args) t = {
          label : string;
          rep : 'args X.t;
          arity : int;
          index : int;
          ocaml_repr : int;
          tyid : 'args Typename.t;
          create :
            ('variant, 'args) Variant_and_record_intf.M.Tag_internal.create;
        }
      end
    module Tag :
      sig
        type ('variant, 'args) create =
            Args of ('args -> 'variant)
          | Const of 'variant
        type ('variant, 'args) t
        val label : ('a, 'b) Variant_and_record_intf.M.??.-> string
        val arity : ('a, 'b) Variant_and_record_intf.M.??.-> int
        val index : ('a, 'b) Variant_and_record_intf.M.??.-> int
        val ocaml_repr : ('a, 'b) Variant_and_record_intf.M.??.-> int
        val create :
          ('variant, 'args) Variant_and_record_intf.M.??.->
          ('variant, 'args) Variant_and_record_intf.M.??.create
        val tyid :
          ('a, 'args) Variant_and_record_intf.M.??.-> 'args Typename.t
        val traverse :
          ('a, 'args) Variant_and_record_intf.M.??.-> 'args X.t
        val internal_use_only :
          ('a, 'b) Variant_and_record_intf.M.Tag_internal.t ->
          ('a, 'b) Variant_and_record_intf.M.??.t
      end
    module Variant_internal :
      sig
        type _ tag =
            Tag :
              ('variant, 'a) Variant_and_record_intf.M.Tag.t -> 'variant
                                                                Variant_and_record_intf.M.Variant_internal.tag
        type _ value =
            Value : ('variant, 'a) Variant_and_record_intf.M.Tag.t *
              '-> 'variant Variant_and_record_intf.M.Variant_internal.value
        type 'a t = {
          typename : 'Typename.t;
          tags : 'Variant_and_record_intf.M.Variant_internal.tag array;
          polymorphic : bool;
          value : '-> 'Variant_and_record_intf.M.Variant_internal.value;
        }
      end
    module Variant :
      sig
        type _ tag =
            Tag :
              ('variant, 'args) Variant_and_record_intf.M.Tag.t -> 'variant
                                                                   Variant_and_record_intf.M.??.tag
        type _ value =
            Value : ('variant, 'args) Variant_and_record_intf.M.Tag.t *
              'args -> 'variant Variant_and_record_intf.M.??.value
        type 'a t
        val typename_of_t :
          'Variant_and_record_intf.M.??.-> 'Typename.t
        val length : 'Variant_and_record_intf.M.??.-> int
        val tag :
          'Variant_and_record_intf.M.??.->
          int -> 'Variant_and_record_intf.M.??.tag
        val is_polymorphic : 'Variant_and_record_intf.M.??.-> bool
        val value :
          'Variant_and_record_intf.M.??.->
          '-> 'Variant_and_record_intf.M.??.value
        val fold :
          'Variant_and_record_intf.M.??.->
          init:'acc ->
          f:('acc -> 'Variant_and_record_intf.M.??.tag -> 'acc) -> 'acc
        val internal_use_only :
          'Variant_and_record_intf.M.Variant_internal.t ->
          'Variant_and_record_intf.M.??.t
      end
    module Field_internal :
      sig
        type ('record, 'field) t = {
          label : string;
          rep : 'field X.t;
          index : int;
          tyid : 'field Typename.t;
          get : 'record -> 'field;
        }
      end
    module Field :
      sig
        type ('record, 'field) t
        val label : ('a, 'b) Variant_and_record_intf.M.??.-> string
        val index : ('a, 'b) Variant_and_record_intf.M.??.-> int
        val get :
          ('record, 'field) Variant_and_record_intf.M.??.->
          'record -> 'field
        val tyid :
          ('a, 'field) Variant_and_record_intf.M.??.-> 'field Typename.t
        val traverse :
          ('a, 'field) Variant_and_record_intf.M.??.-> 'field X.t
        val internal_use_only :
          ('a, 'b) Variant_and_record_intf.M.Field_internal.t ->
          ('a, 'b) Variant_and_record_intf.M.??.t
      end
    module Record_internal :
      sig
        type _ field =
            Field :
              ('record, 'a) Variant_and_record_intf.M.Field.t -> 'record
                                                                 Variant_and_record_intf.M.Record_internal.field
        type 'record fields = {
          get :
            'field.
              ('record, 'field) Variant_and_record_intf.M.Field.t -> 'field;
        }
        type 'a t = {
          typename : 'Typename.t;
          fields : 'Variant_and_record_intf.M.Record_internal.field array;
          has_double_array_tag : bool;
          create : 'Variant_and_record_intf.M.Record_internal.fields -> 'a;
        }
      end
    module Record :
      sig
        type _ field =
            Field :
              ('record, 'a) Variant_and_record_intf.M.Field.t -> 'record
                                                                 Variant_and_record_intf.M.??.field
        type 'record fields = {
          get :
            'field.
              ('record, 'field) Variant_and_record_intf.M.Field.t -> 'field;
        }
        type 'a t
        val typename_of_t :
          'Variant_and_record_intf.M.??.-> 'Typename.t
        val length : 'Variant_and_record_intf.M.??.-> int
        val field :
          'Variant_and_record_intf.M.??.->
          int -> 'Variant_and_record_intf.M.??.field
        val has_double_array_tag : 'Variant_and_record_intf.M.??.-> bool
        val create :
          'Variant_and_record_intf.M.??.->
          'Variant_and_record_intf.M.??.fields -> 'a
        val fold :
          'Variant_and_record_intf.M.??.->
          init:'acc ->
          f:('acc -> 'Variant_and_record_intf.M.??.field -> 'acc) -> 'acc
        val internal_use_only :
          'Variant_and_record_intf.M.Record_internal.t ->
          'Variant_and_record_intf.M.??.t
      end
  end