sig
  module type S =
    sig
      type key
      type !'a t
      val create : int -> 'Ephemeron.S.t
      val clear : 'Ephemeron.S.t -> unit
      val reset : 'Ephemeron.S.t -> unit
      val copy : 'Ephemeron.S.t -> 'Ephemeron.S.t
      val add : 'Ephemeron.S.t -> Ephemeron.S.key -> '-> unit
      val remove : 'Ephemeron.S.t -> Ephemeron.S.key -> unit
      val find : 'Ephemeron.S.t -> Ephemeron.S.key -> 'a
      val find_opt : 'Ephemeron.S.t -> Ephemeron.S.key -> 'a option
      val find_all : 'Ephemeron.S.t -> Ephemeron.S.key -> 'a list
      val replace : 'Ephemeron.S.t -> Ephemeron.S.key -> '-> unit
      val mem : 'Ephemeron.S.t -> Ephemeron.S.key -> bool
      val length : 'Ephemeron.S.t -> int
      val stats : 'Ephemeron.S.t -> Stdlib.Hashtbl.statistics
      val add_seq :
        'Ephemeron.S.t -> (Ephemeron.S.key * 'a) Stdlib.Seq.t -> unit
      val replace_seq :
        'Ephemeron.S.t -> (Ephemeron.S.key * 'a) Stdlib.Seq.t -> unit
      val of_seq : (Ephemeron.S.key * 'a) Stdlib.Seq.t -> 'Ephemeron.S.t
      val clean : 'Ephemeron.S.t -> unit
      val stats_alive : 'Ephemeron.S.t -> Stdlib.Hashtbl.statistics
    end
  module type SeededS =
    sig
      type key
      type !'a t
      val create : ?random:bool -> int -> 'Ephemeron.SeededS.t
      val clear : 'Ephemeron.SeededS.t -> unit
      val reset : 'Ephemeron.SeededS.t -> unit
      val copy : 'Ephemeron.SeededS.t -> 'Ephemeron.SeededS.t
      val add : 'Ephemeron.SeededS.t -> Ephemeron.SeededS.key -> '-> unit
      val remove : 'Ephemeron.SeededS.t -> Ephemeron.SeededS.key -> unit
      val find : 'Ephemeron.SeededS.t -> Ephemeron.SeededS.key -> 'a
      val find_opt :
        'Ephemeron.SeededS.t -> Ephemeron.SeededS.key -> 'a option
      val find_all :
        'Ephemeron.SeededS.t -> Ephemeron.SeededS.key -> 'a list
      val replace :
        'Ephemeron.SeededS.t -> Ephemeron.SeededS.key -> '-> unit
      val mem : 'Ephemeron.SeededS.t -> Ephemeron.SeededS.key -> bool
      val length : 'Ephemeron.SeededS.t -> int
      val stats : 'Ephemeron.SeededS.t -> Stdlib.Hashtbl.statistics
      val add_seq :
        'Ephemeron.SeededS.t ->
        (Ephemeron.SeededS.key * 'a) Stdlib.Seq.t -> unit
      val replace_seq :
        'Ephemeron.SeededS.t ->
        (Ephemeron.SeededS.key * 'a) Stdlib.Seq.t -> unit
      val of_seq :
        (Ephemeron.SeededS.key * 'a) Stdlib.Seq.t -> 'Ephemeron.SeededS.t
      val clean : 'Ephemeron.SeededS.t -> unit
      val stats_alive : 'Ephemeron.SeededS.t -> Stdlib.Hashtbl.statistics
    end
  module K1 :
    sig
      type ('k, 'd) t
      val make : '-> '-> ('k, 'd) Ephemeron.K1.t
      val query : ('k, 'd) Ephemeron.K1.t -> '-> 'd option
      module Make :
        functor (H : Hashtbl.HashedType->
          sig
            type key = H.t
            type !'a t
            val create : int -> 'a t
            val clear : 'a t -> unit
            val reset : 'a t -> unit
            val copy : 'a t -> 'a t
            val add : 'a t -> key -> '-> unit
            val remove : 'a t -> key -> unit
            val find : 'a t -> key -> 'a
            val find_opt : 'a t -> key -> 'a option
            val find_all : 'a t -> key -> 'a list
            val replace : 'a t -> key -> '-> unit
            val mem : 'a t -> key -> bool
            val length : 'a t -> int
            val stats : 'a t -> Hashtbl.statistics
            val add_seq : 'a t -> (key * 'a) Seq.t -> unit
            val replace_seq : 'a t -> (key * 'a) Seq.t -> unit
            val of_seq : (key * 'a) Seq.t -> 'a t
            val clean : 'a t -> unit
            val stats_alive : 'a t -> Hashtbl.statistics
          end
      module MakeSeeded :
        functor (H : Hashtbl.SeededHashedType->
          sig
            type key = H.t
            type !'a t
            val create : ?random:bool -> int -> 'a t
            val clear : 'a t -> unit
            val reset : 'a t -> unit
            val copy : 'a t -> 'a t
            val add : 'a t -> key -> '-> unit
            val remove : 'a t -> key -> unit
            val find : 'a t -> key -> 'a
            val find_opt : 'a t -> key -> 'a option
            val find_all : 'a t -> key -> 'a list
            val replace : 'a t -> key -> '-> unit
            val mem : 'a t -> key -> bool
            val length : 'a t -> int
            val stats : 'a t -> Hashtbl.statistics
            val add_seq : 'a t -> (key * 'a) Seq.t -> unit
            val replace_seq : 'a t -> (key * 'a) Seq.t -> unit
            val of_seq : (key * 'a) Seq.t -> 'a t
            val clean : 'a t -> unit
            val stats_alive : 'a t -> Hashtbl.statistics
          end
      module Bucket :
        sig
          type ('k, 'd) t
          val make : unit -> ('k, 'd) Ephemeron.K1.Bucket.t
          val add : ('k, 'd) Ephemeron.K1.Bucket.t -> '-> '-> unit
          val remove : ('k, 'd) Ephemeron.K1.Bucket.t -> '-> unit
          val find : ('k, 'd) Ephemeron.K1.Bucket.t -> '-> 'd option
          val length : ('k, 'd) Ephemeron.K1.Bucket.t -> int
          val clear : ('k, 'd) Ephemeron.K1.Bucket.t -> unit
        end
    end
  module K2 :
    sig
      type ('k1, 'k2, 'd) t
      val make : 'k1 -> 'k2 -> '-> ('k1, 'k2, 'd) Ephemeron.K2.t
      val query : ('k1, 'k2, 'd) Ephemeron.K2.t -> 'k1 -> 'k2 -> 'd option
      module Make :
        functor (H1 : Hashtbl.HashedType) (H2 : Hashtbl.HashedType->
          sig
            type key = H1.t * H2.t
            type !'a t
            val create : int -> 'a t
            val clear : 'a t -> unit
            val reset : 'a t -> unit
            val copy : 'a t -> 'a t
            val add : 'a t -> key -> '-> unit
            val remove : 'a t -> key -> unit
            val find : 'a t -> key -> 'a
            val find_opt : 'a t -> key -> 'a option
            val find_all : 'a t -> key -> 'a list
            val replace : 'a t -> key -> '-> unit
            val mem : 'a t -> key -> bool
            val length : 'a t -> int
            val stats : 'a t -> Hashtbl.statistics
            val add_seq : 'a t -> (key * 'a) Seq.t -> unit
            val replace_seq : 'a t -> (key * 'a) Seq.t -> unit
            val of_seq : (key * 'a) Seq.t -> 'a t
            val clean : 'a t -> unit
            val stats_alive : 'a t -> Hashtbl.statistics
          end
      module MakeSeeded :
        functor (H1 : Hashtbl.SeededHashedType)
          (H2 : Hashtbl.SeededHashedType->
          sig
            type key = H1.t * H2.t
            type !'a t
            val create : ?random:bool -> int -> 'a t
            val clear : 'a t -> unit
            val reset : 'a t -> unit
            val copy : 'a t -> 'a t
            val add : 'a t -> key -> '-> unit
            val remove : 'a t -> key -> unit
            val find : 'a t -> key -> 'a
            val find_opt : 'a t -> key -> 'a option
            val find_all : 'a t -> key -> 'a list
            val replace : 'a t -> key -> '-> unit
            val mem : 'a t -> key -> bool
            val length : 'a t -> int
            val stats : 'a t -> Hashtbl.statistics
            val add_seq : 'a t -> (key * 'a) Seq.t -> unit
            val replace_seq : 'a t -> (key * 'a) Seq.t -> unit
            val of_seq : (key * 'a) Seq.t -> 'a t
            val clean : 'a t -> unit
            val stats_alive : 'a t -> Hashtbl.statistics
          end
      module Bucket :
        sig
          type ('k1, 'k2, 'd) t
          val make : unit -> ('k1, 'k2, 'd) Ephemeron.K2.Bucket.t
          val add :
            ('k1, 'k2, 'd) Ephemeron.K2.Bucket.t -> 'k1 -> 'k2 -> '-> unit
          val remove :
            ('k1, 'k2, 'd) Ephemeron.K2.Bucket.t -> 'k1 -> 'k2 -> unit
          val find :
            ('k1, 'k2, 'd) Ephemeron.K2.Bucket.t -> 'k1 -> 'k2 -> 'd option
          val length : ('k1, 'k2, 'd) Ephemeron.K2.Bucket.t -> int
          val clear : ('k1, 'k2, 'd) Ephemeron.K2.Bucket.t -> unit
        end
    end
  module Kn :
    sig
      type ('k, 'd) t
      val make : 'k array -> '-> ('k, 'd) Ephemeron.Kn.t
      val query : ('k, 'd) Ephemeron.Kn.t -> 'k array -> 'd option
      module Make :
        functor (H : Hashtbl.HashedType->
          sig
            type key = H.t array
            type !'a t
            val create : int -> 'a t
            val clear : 'a t -> unit
            val reset : 'a t -> unit
            val copy : 'a t -> 'a t
            val add : 'a t -> key -> '-> unit
            val remove : 'a t -> key -> unit
            val find : 'a t -> key -> 'a
            val find_opt : 'a t -> key -> 'a option
            val find_all : 'a t -> key -> 'a list
            val replace : 'a t -> key -> '-> unit
            val mem : 'a t -> key -> bool
            val length : 'a t -> int
            val stats : 'a t -> Hashtbl.statistics
            val add_seq : 'a t -> (key * 'a) Seq.t -> unit
            val replace_seq : 'a t -> (key * 'a) Seq.t -> unit
            val of_seq : (key * 'a) Seq.t -> 'a t
            val clean : 'a t -> unit
            val stats_alive : 'a t -> Hashtbl.statistics
          end
      module MakeSeeded :
        functor (H : Hashtbl.SeededHashedType->
          sig
            type key = H.t array
            type !'a t
            val create : ?random:bool -> int -> 'a t
            val clear : 'a t -> unit
            val reset : 'a t -> unit
            val copy : 'a t -> 'a t
            val add : 'a t -> key -> '-> unit
            val remove : 'a t -> key -> unit
            val find : 'a t -> key -> 'a
            val find_opt : 'a t -> key -> 'a option
            val find_all : 'a t -> key -> 'a list
            val replace : 'a t -> key -> '-> unit
            val mem : 'a t -> key -> bool
            val length : 'a t -> int
            val stats : 'a t -> Hashtbl.statistics
            val add_seq : 'a t -> (key * 'a) Seq.t -> unit
            val replace_seq : 'a t -> (key * 'a) Seq.t -> unit
            val of_seq : (key * 'a) Seq.t -> 'a t
            val clean : 'a t -> unit
            val stats_alive : 'a t -> Hashtbl.statistics
          end
      module Bucket :
        sig
          type ('k, 'd) t
          val make : unit -> ('k, 'd) Ephemeron.Kn.Bucket.t
          val add : ('k, 'd) Ephemeron.Kn.Bucket.t -> 'k array -> '-> unit
          val remove : ('k, 'd) Ephemeron.Kn.Bucket.t -> 'k array -> unit
          val find : ('k, 'd) Ephemeron.Kn.Bucket.t -> 'k array -> 'd option
          val length : ('k, 'd) Ephemeron.Kn.Bucket.t -> int
          val clear : ('k, 'd) Ephemeron.Kn.Bucket.t -> unit
        end
    end
end