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