sig
  module rec Typerep :
    sig
      type _ t =
          Int : int Std_internal.Typerep.t
        | Int32 : int32 Std_internal.Typerep.t
        | Int64 : int64 Std_internal.Typerep.t
        | Nativeint : nativeint Std_internal.Typerep.t
        | Char : char Std_internal.Typerep.t
        | Float : float Std_internal.Typerep.t
        | String : string Std_internal.Typerep.t
        | Bool : bool Std_internal.Typerep.t
        | Unit : unit Std_internal.Typerep.t
        | Option :
            'Std_internal.Typerep.t -> 'a option Std_internal.Typerep.t
        | List : 'Std_internal.Typerep.t -> 'a list Std_internal.Typerep.t
        | Array :
            'Std_internal.Typerep.t -> 'a array Std_internal.Typerep.t
        | Lazy :
            'Std_internal.Typerep.t -> 'Lazy.t Std_internal.Typerep.t
        | Ref :
            'Std_internal.Typerep.t -> 'Pervasives.ref
                                         Std_internal.Typerep.t
        | Function :
            ('dom Std_internal.Typerep.t * 'rng Std_internal.Typerep.t) -> 
            ('dom -> 'rng) Std_internal.Typerep.t
        | Tuple :
            'Std_internal.Typerep.Tuple.t -> 'Std_internal.Typerep.t
        | Record :
            'Std_internal.Typerep.Record.t -> 'Std_internal.Typerep.t
        | Variant :
            'Std_internal.Typerep.Variant.t -> 'Std_internal.Typerep.t
        | Named :
            ('Std_internal.Typerep.Named.t *
             'Std_internal.Typerep.t Lazy.t option) -> 'a
                                                         Std_internal.Typerep.t
      type packed =
          T : 'Std_internal.Typerep.t -> Std_internal.Typerep.packed
      module Named :
        sig
          module type T0 =
            sig
              type named
              type t
              val typename_of_named :
                Std_internal.Typerep.Named.T0.named Typename.t
              val typename_of_t : Std_internal.Typerep.Named.T0.t Typename.t
              val witness :
                (Std_internal.Typerep.Named.T0.t,
                 Std_internal.Typerep.Named.T0.named)
                Type_equal.t
            end
          module type T1 =
            sig
              type 'a named
              type a
              val a : Std_internal.Typerep.Named.T1.a Std_internal.Typerep.t
              type t
              val typename_of_named :
                'Typename.t ->
                'Std_internal.Typerep.Named.T1.named Typename.t
              val typename_of_t : Std_internal.Typerep.Named.T1.t Typename.t
              val witness :
                (Std_internal.Typerep.Named.T1.t,
                 Std_internal.Typerep.Named.T1.a
                 Std_internal.Typerep.Named.T1.named)
                Type_equal.t
            end
          module type T2 =
            sig
              type ('a, 'b) named
              type a
              val a : Std_internal.Typerep.Named.T2.a Std_internal.Typerep.t
              type b
              val b : Std_internal.Typerep.Named.T2.b Std_internal.Typerep.t
              type t
              val typename_of_named :
                'Typename.t ->
                'Typename.t ->
                ('a, 'b) Std_internal.Typerep.Named.T2.named Typename.t
              val typename_of_t : Std_internal.Typerep.Named.T2.t Typename.t
              val witness :
                (Std_internal.Typerep.Named.T2.t,
                 (Std_internal.Typerep.Named.T2.a,
                  Std_internal.Typerep.Named.T2.b)
                 Std_internal.Typerep.Named.T2.named)
                Type_equal.t
            end
          module type T3 =
            sig
              type ('a, 'b, 'c) named
              type a
              val a : Std_internal.Typerep.Named.T3.a Std_internal.Typerep.t
              type b
              val b : Std_internal.Typerep.Named.T3.b Std_internal.Typerep.t
              type c
              val c : Std_internal.Typerep.Named.T3.c Std_internal.Typerep.t
              type t
              val typename_of_named :
                'Typename.t ->
                'Typename.t ->
                'Typename.t ->
                ('a, 'b, 'c) Std_internal.Typerep.Named.T3.named Typename.t
              val typename_of_t : Std_internal.Typerep.Named.T3.t Typename.t
              val witness :
                (Std_internal.Typerep.Named.T3.t,
                 (Std_internal.Typerep.Named.T3.a,
                  Std_internal.Typerep.Named.T3.b,
                  Std_internal.Typerep.Named.T3.c)
                 Std_internal.Typerep.Named.T3.named)
                Type_equal.t
            end
          module type T4 =
            sig
              type ('a, 'b, 'c, 'd) named
              type a
              val a : Std_internal.Typerep.Named.T4.a Std_internal.Typerep.t
              type b
              val b : Std_internal.Typerep.Named.T4.b Std_internal.Typerep.t
              type c
              val c : Std_internal.Typerep.Named.T4.c Std_internal.Typerep.t
              type d
              val d : Std_internal.Typerep.Named.T4.d Std_internal.Typerep.t
              type t
              val typename_of_named :
                'Typename.t ->
                'Typename.t ->
                'Typename.t ->
                'Typename.t ->
                ('a, 'b, 'c, 'd) Std_internal.Typerep.Named.T4.named
                Typename.t
              val typename_of_t : Std_internal.Typerep.Named.T4.t Typename.t
              val witness :
                (Std_internal.Typerep.Named.T4.t,
                 (Std_internal.Typerep.Named.T4.a,
                  Std_internal.Typerep.Named.T4.b,
                  Std_internal.Typerep.Named.T4.c,
                  Std_internal.Typerep.Named.T4.d)
                 Std_internal.Typerep.Named.T4.named)
                Type_equal.t
            end
          module type T5 =
            sig
              type ('a, 'b, 'c, 'd, 'e) named
              type a
              val a : Std_internal.Typerep.Named.T5.a Std_internal.Typerep.t
              type b
              val b : Std_internal.Typerep.Named.T5.b Std_internal.Typerep.t
              type c
              val c : Std_internal.Typerep.Named.T5.c Std_internal.Typerep.t
              type d
              val d : Std_internal.Typerep.Named.T5.d Std_internal.Typerep.t
              type e
              val e : Std_internal.Typerep.Named.T5.e Std_internal.Typerep.t
              type t
              val typename_of_named :
                'Typename.t ->
                'Typename.t ->
                'Typename.t ->
                'Typename.t ->
                'Typename.t ->
                ('a, 'b, 'c, 'd, 'e) Std_internal.Typerep.Named.T5.named
                Typename.t
              val typename_of_t : Std_internal.Typerep.Named.T5.t Typename.t
              val witness :
                (Std_internal.Typerep.Named.T5.t,
                 (Std_internal.Typerep.Named.T5.a,
                  Std_internal.Typerep.Named.T5.b,
                  Std_internal.Typerep.Named.T5.c,
                  Std_internal.Typerep.Named.T5.d,
                  Std_internal.Typerep.Named.T5.e)
                 Std_internal.Typerep.Named.T5.named)
                Type_equal.t
            end
          type 'a t =
              T0 of (module Std_internal.Typerep.Named.T0 with type t = 'a)
            | T1 of (module Std_internal.Typerep.Named.T1 with type t = 'a)
            | T2 of (module Std_internal.Typerep.Named.T2 with type t = 'a)
            | T3 of (module Std_internal.Typerep.Named.T3 with type t = 'a)
            | T4 of (module Std_internal.Typerep.Named.T4 with type t = 'a)
            | T5 of (module Std_internal.Typerep.Named.T5 with type t = 'a)
          val arity : 'Std_internal.Typerep.Named.t -> int
          val typename_of_t :
            'Std_internal.Typerep.Named.t -> 'Typename.t
          val name : 'Std_internal.Typerep.Named.t -> string
        end
      module Tuple :
        sig
          type _ t =
              T2 :
                ('Std_internal.Typerep.t * 'Std_internal.Typerep.t) -> 
                ('a * 'b) Std_internal.Typerep.Tuple.t
            | T3 :
                ('Std_internal.Typerep.t * 'Std_internal.Typerep.t *
                 'Std_internal.Typerep.t) -> ('a * 'b * 'c)
                                               Std_internal.Typerep.Tuple.t
            | T4 :
                ('Std_internal.Typerep.t * 'Std_internal.Typerep.t *
                 'Std_internal.Typerep.t * 'Std_internal.Typerep.t) -> 
                ('a * 'b * 'c * 'd) Std_internal.Typerep.Tuple.t
            | T5 :
                ('Std_internal.Typerep.t * 'Std_internal.Typerep.t *
                 'Std_internal.Typerep.t * 'Std_internal.Typerep.t *
                 'Std_internal.Typerep.t) -> ('a * 'b * 'c * 'd * 'e)
                                               Std_internal.Typerep.Tuple.t
          val arity : 'Std_internal.Typerep.Tuple.t -> int
          val typename_of_t :
            'Std_internal.Typerep.Tuple.t -> 'Typename.t
        end
      module Tag_internal :
        sig
          type ('variant, 'args) create =
              Args of ('args -> 'variant)
            | Const of 'variant
          type ('variant, 'args) t = {
            label : string;
            rep : 'args t;
            arity : int;
            index : int;
            ocaml_repr : int;
            tyid : 'args Typename.t;
            create : ('variant, 'args) create;
          }
        end
      module Tag :
        sig
          type ('variant, 'args) create =
              Args of ('args -> 'variant)
            | Const of 'variant
          type ('variant, 'args) t
          val label : ('a, 'b) t -> string
          val arity : ('a, 'b) t -> int
          val index : ('a, 'b) t -> int
          val ocaml_repr : ('a, 'b) t -> int
          val create : ('variant, 'args) t -> ('variant, 'args) create
          val tyid : ('a, 'args) t -> 'args Typename.t
          val traverse : ('a, 'args) t -> 'args t
          val internal_use_only : ('a, 'b) Tag_internal.t -> ('a, 'b) t
        end
      module Variant_internal :
        sig
          type _ tag = Tag : ('variant, 'a) Tag.t -> 'variant tag
          type _ value = Value : ('variant, 'a) Tag.t * '-> 'variant value
          type 'a t = {
            typename : 'Typename.t;
            tags : 'a tag array;
            polymorphic : bool;
            value : '-> 'a value;
          }
        end
      module Variant :
        sig
          type _ tag = Tag : ('variant, 'args) Tag.t -> 'variant tag
          type _ value =
              Value : ('variant, 'args) Tag.t * 'args -> 'variant value
          type 'a t
          val typename_of_t : 'a t -> 'Typename.t
          val length : 'a t -> int
          val tag : 'a t -> int -> 'a tag
          val is_polymorphic : 'a t -> bool
          val value : 'a t -> '-> 'a value
          val fold : 'a t -> init:'acc -> f:('acc -> 'a tag -> 'acc) -> 'acc
          val internal_use_only : 'Variant_internal.t -> 'a t
        end
      module Field_internal :
        sig
          type ('record, 'field) t = {
            label : string;
            rep : 'field t;
            index : int;
            tyid : 'field Typename.t;
            get : 'record -> 'field;
          }
        end
      module Field :
        sig
          type ('record, 'field) t
          val label : ('a, 'b) t -> string
          val index : ('a, 'b) t -> int
          val get : ('record, 'field) t -> 'record -> 'field
          val tyid : ('a, 'field) t -> 'field Typename.t
          val traverse : ('a, 'field) t -> 'field t
          val internal_use_only : ('a, 'b) Field_internal.t -> ('a, 'b) t
        end
      module Record_internal :
        sig
          type _ field = Field : ('record, 'a) Field.t -> 'record field
          type 'record fields = {
            get : 'field. ('record, 'field) Field.t -> 'field;
          }
          type 'a t = {
            typename : 'Typename.t;
            fields : 'a field array;
            has_double_array_tag : bool;
            create : 'a fields -> 'a;
          }
        end
      module Record :
        sig
          type _ field = Field : ('record, 'a) Field.t -> 'record field
          type 'record fields = {
            get : 'field. ('record, 'field) Field.t -> 'field;
          }
          type 'a t
          val typename_of_t : 'a t -> 'Typename.t
          val length : 'a t -> int
          val field : 'a t -> int -> 'a field
          val has_double_array_tag : 'a t -> bool
          val create : 'a t -> 'a fields -> 'a
          val fold :
            'a t -> init:'acc -> f:('acc -> 'a field -> 'acc) -> 'acc
          val internal_use_only : 'Record_internal.t -> 'a t
        end
      val same :
        'Std_internal.Typerep.t -> 'Std_internal.Typerep.t -> bool
      val same_witness :
        'Std_internal.Typerep.t ->
        'Std_internal.Typerep.t -> ('a, 'b) Type_equal.t option
      val same_witness_exn :
        'Std_internal.Typerep.t ->
        'Std_internal.Typerep.t -> ('a, 'b) Type_equal.t
      val typename_of_t : 'Std_internal.Typerep.t -> 'Typename.t
      val head : 'Std_internal.Typerep.t -> 'Std_internal.Typerep.t
    end
  val typerep_of_int : int Std_internal.Typerep.t
  val typerep_of_int32 : int32 Std_internal.Typerep.t
  val typerep_of_int64 : int64 Std_internal.Typerep.t
  val typerep_of_nativeint : nativeint Std_internal.Typerep.t
  val typerep_of_char : char Std_internal.Typerep.t
  val typerep_of_float : float Std_internal.Typerep.t
  val typerep_of_string : string Std_internal.Typerep.t
  val typerep_of_bool : bool Std_internal.Typerep.t
  val typerep_of_unit : unit Std_internal.Typerep.t
  type tuple0
  val value_tuple0 : Std_internal.tuple0
  val typerep_of_option :
    'Std_internal.Typerep.t -> 'a option Std_internal.Typerep.t
  val typerep_of_list :
    'Std_internal.Typerep.t -> 'a list Std_internal.Typerep.t
  val typerep_of_array :
    'Std_internal.Typerep.t -> 'a array Std_internal.Typerep.t
  val typerep_of_lazy_t :
    'Std_internal.Typerep.t -> 'a lazy_t Std_internal.Typerep.t
  val typerep_of_ref :
    'Std_internal.Typerep.t -> 'Pervasives.ref Std_internal.Typerep.t
  val typerep_of_function :
    'Std_internal.Typerep.t ->
    'Std_internal.Typerep.t -> ('-> 'b) Std_internal.Typerep.t
  val typerep_of_tuple0 : Std_internal.tuple0 Std_internal.Typerep.t
  val typerep_of_tuple2 :
    'Std_internal.Typerep.t ->
    'Std_internal.Typerep.t -> ('a * 'b) Std_internal.Typerep.t
  val typerep_of_tuple3 :
    'Std_internal.Typerep.t ->
    'Std_internal.Typerep.t ->
    'Std_internal.Typerep.t -> ('a * 'b * 'c) Std_internal.Typerep.t
  val typerep_of_tuple4 :
    'Std_internal.Typerep.t ->
    'Std_internal.Typerep.t ->
    'Std_internal.Typerep.t ->
    'Std_internal.Typerep.t -> ('a * 'b * 'c * 'd) Std_internal.Typerep.t
  val typerep_of_tuple5 :
    'Std_internal.Typerep.t ->
    'Std_internal.Typerep.t ->
    'Std_internal.Typerep.t ->
    'Std_internal.Typerep.t ->
    'Std_internal.Typerep.t ->
    ('a * 'b * 'c * 'd * 'e) Std_internal.Typerep.t
  val typename_of_int : int Typename.t
  val typename_of_int32 : int32 Typename.t
  val typename_of_int64 : int64 Typename.t
  val typename_of_nativeint : nativeint Typename.t
  val typename_of_char : char Typename.t
  val typename_of_float : float Typename.t
  val typename_of_string : string Typename.t
  val typename_of_bool : bool Typename.t
  val typename_of_unit : unit Typename.t
  val typename_of_option : 'Typename.t -> 'a option Typename.t
  val typename_of_list : 'Typename.t -> 'a list Typename.t
  val typename_of_array : 'Typename.t -> 'a array Typename.t
  val typename_of_lazy_t : 'Typename.t -> 'a lazy_t Typename.t
  val typename_of_ref : 'Typename.t -> 'Pervasives.ref Typename.t
  val typename_of_function :
    'Typename.t -> 'Typename.t -> ('-> 'b) Typename.t
  val typename_of_tuple0 : Std_internal.tuple0 Typename.t
  val typename_of_tuple2 :
    'Typename.t -> 'Typename.t -> ('a * 'b) Typename.t
  val typename_of_tuple3 :
    'Typename.t ->
    'Typename.t -> 'Typename.t -> ('a * 'b * 'c) Typename.t
  val typename_of_tuple4 :
    'Typename.t ->
    'Typename.t ->
    'Typename.t -> 'Typename.t -> ('a * 'b * 'c * 'd) Typename.t
  val typename_of_tuple5 :
    'Typename.t ->
    'Typename.t ->
    'Typename.t ->
    'Typename.t -> 'Typename.t -> ('a * 'b * 'c * 'd * 'e) Typename.t
end