sig
  type 'a t
  type 'a typename = 'Typename.t
  val create : ?name:string -> unit -> 'Typename.t
  val static : unit Typename.t
  val same : 'Typename.t -> 'Typename.t -> bool
  val same_witness :
    'Typename.t -> 'Typename.t -> ('a, 'b) Type_equal.t option
  val same_witness_exn :
    'Typename.t -> 'Typename.t -> ('a, 'b) Type_equal.t
  module Key :
    sig
      type t
      val compare : Typename.Key.t -> Typename.Key.t -> int
      val equal : Typename.Key.t -> Typename.Key.t -> bool
      val hash : Typename.Key.t -> int
    end
  val key : 'Typename.t -> Typename.Key.t
  module Uid :
    sig
      type t
      val compare : Typename.Uid.t -> Typename.Uid.t -> int
      val equal : Typename.Uid.t -> Typename.Uid.t -> bool
      val hash : Typename.Uid.t -> int
      val name : Typename.Uid.t -> string
    end
  val uid : 'Typename.t -> Typename.Uid.t
  val name : 'Typename.t -> string
  module type S0 =
    sig type t val typename_of_t : Typename.S0.t Typename.typename end
  module type S1 =
    sig
      type 'a t
      val typename_of_t :
        'Typename.typename -> 'Typename.S1.t Typename.typename
    end
  module type S2 =
    sig
      type ('a, 'b) t
      val typename_of_t :
        'Typename.typename ->
        'Typename.typename -> ('a, 'b) Typename.S2.t Typename.typename
    end
  module type S3 =
    sig
      type ('a, 'b, 'c) t
      val typename_of_t :
        'Typename.typename ->
        'Typename.typename ->
        'Typename.typename -> ('a, 'b, 'c) Typename.S3.t Typename.typename
    end
  module type S4 =
    sig
      type ('a, 'b, 'c, 'd) t
      val typename_of_t :
        'Typename.typename ->
        'Typename.typename ->
        'Typename.typename ->
        'Typename.typename ->
        ('a, 'b, 'c, 'd) Typename.S4.t Typename.typename
    end
  module type S5 =
    sig
      type ('a, 'b, 'c, 'd, 'e) t
      val typename_of_t :
        'Typename.typename ->
        'Typename.typename ->
        'Typename.typename ->
        'Typename.typename ->
        'Typename.typename ->
        ('a, 'b, 'c, 'd, 'e) Typename.S5.t Typename.typename
    end
  module Make0 :
    functor (X : Named_intf.S0-> sig val typename_of_t : X.t typename end
  module Make1 :
    functor (X : Named_intf.S1->
      sig val typename_of_t : 'a typename -> 'X.t typename end
  module Make2 :
    functor (X : Named_intf.S2->
      sig
        val typename_of_t :
          'a typename -> 'b typename -> ('a, 'b) X.t typename
      end
  module Make3 :
    functor (X : Named_intf.S3->
      sig
        val typename_of_t :
          'a typename ->
          'b typename -> 'c typename -> ('a, 'b, 'c) X.t typename
      end
  module Make4 :
    functor (X : Named_intf.S4->
      sig
        val typename_of_t :
          'a typename ->
          'b typename ->
          'c typename -> 'd typename -> ('a, 'b, 'c, 'd) X.t typename
      end
  module Make5 :
    functor (X : Named_intf.S5->
      sig
        val typename_of_t :
          'a typename ->
          'b typename ->
          'c typename ->
          'd typename -> 'e typename -> ('a, 'b, 'c, 'd, 'e) X.t typename
      end
  module Table :
    functor (X : sig type 'a t end->
      sig
        type t
        val create : int -> Typename.Table.t
        val mem : Typename.Table.t -> 'Typename.typename -> bool
        val set : Typename.Table.t -> 'Typename.typename -> 'X.t -> unit
        val find : Typename.Table.t -> 'Typename.typename -> 'X.t option
      end
  module Same_witness_exn_1 :
    functor (A : S1) (B : S1->
      sig
        type t = { eq : 'a. ('A.t, 'B.t) Type_equal.t; }
        val witness : Typename.Same_witness_exn_1.t
      end
  module Same_witness_exn_2 :
    functor (A : S2) (B : S2->
      sig
        type t = { eq : ''b. (('a, 'b) A.t, ('a, 'b) B.t) Type_equal.t; }
        val witness : Typename.Same_witness_exn_2.t
      end
  module Same_witness_exn_3 :
    functor (A : S3) (B : S3->
      sig
        type t = {
          eq : '''c. (('a, 'b, 'c) A.t, ('a, 'b, 'c) B.t) Type_equal.t;
        }
        val witness : Typename.Same_witness_exn_3.t
      end
  module Same_witness_exn_4 :
    functor (A : S4) (B : S4->
      sig
        type t = {
          eq :
            ''''d.
              (('a, 'b, 'c, 'd) A.t, ('a, 'b, 'c, 'd) B.t) Type_equal.t;
        }
        val witness : Typename.Same_witness_exn_4.t
      end
  module Same_witness_exn_5 :
    functor (A : S5) (B : S5->
      sig
        type t = {
          eq :
            '''''e.
              (('a, 'b, 'c, 'd, 'e) A.t, ('a, 'b, 'c, 'd, 'e) B.t)
              Type_equal.t;
        }
        val witness : Typename.Same_witness_exn_5.t
      end
end