sig
  module Hashtbl :
    sig
      type ('a, 'b) t = ('a, 'b) Hashtbl.t
      val exists : ('a, 'b) ExtHashtbl.Hashtbl.t -> '-> bool
      val keys : ('a, 'b) ExtHashtbl.Hashtbl.t -> 'Enum.t
      val values : ('a, 'b) ExtHashtbl.Hashtbl.t -> 'Enum.t
      val enum : ('a, 'b) ExtHashtbl.Hashtbl.t -> ('a * 'b) Enum.t
      val of_enum : ('a * 'b) Enum.t -> ('a, 'b) ExtHashtbl.Hashtbl.t
      val find_default : ('a, 'b) ExtHashtbl.Hashtbl.t -> '-> '-> 'b
      val find_opt : ('a, 'b) Hashtbl.t -> '-> 'b option
      val find_option : ('a, 'b) Hashtbl.t -> '-> 'b option
      val remove_all : ('a, 'b) ExtHashtbl.Hashtbl.t -> '-> unit
      val map :
        ('-> 'c) ->
        ('a, 'b) ExtHashtbl.Hashtbl.t -> ('a, 'c) ExtHashtbl.Hashtbl.t
      val length : ('a, 'b) ExtHashtbl.Hashtbl.t -> int
      val reset : ('a, 'b) ExtHashtbl.Hashtbl.t -> unit
      val randomize : unit -> unit
      type statistics = {
        num_bindings : int;
        num_buckets : int;
        max_bucket_length : int;
        bucket_histogram : int array;
      }
      val stats :
        ('a, 'b) ExtHashtbl.Hashtbl.t -> ExtHashtbl.Hashtbl.statistics
      val seeded_hash_param : int -> int -> int -> '-> int
      val seeded_hash : int -> '-> int
      val is_randomized : unit -> bool
      val filter_map_inplace :
        ('-> '-> 'b option) -> ('a, 'b) ExtHashtbl.Hashtbl.t -> unit
      val create : ?random:bool -> int -> ('a, 'b) ExtHashtbl.Hashtbl.t
      val clear : ('a, 'b) ExtHashtbl.Hashtbl.t -> unit
      val add : ('a, 'b) ExtHashtbl.Hashtbl.t -> '-> '-> unit
      val copy :
        ('a, 'b) ExtHashtbl.Hashtbl.t -> ('a, 'b) ExtHashtbl.Hashtbl.t
      val find : ('a, 'b) ExtHashtbl.Hashtbl.t -> '-> 'b
      val find_all : ('a, 'b) ExtHashtbl.Hashtbl.t -> '-> 'b list
      val mem : ('a, 'b) ExtHashtbl.Hashtbl.t -> '-> bool
      val remove : ('a, 'b) ExtHashtbl.Hashtbl.t -> '-> unit
      val replace : ('a, 'b) ExtHashtbl.Hashtbl.t -> '-> '-> unit
      val iter : ('-> '-> unit) -> ('a, 'b) ExtHashtbl.Hashtbl.t -> unit
      val fold :
        ('-> '-> '-> 'c) -> ('a, 'b) ExtHashtbl.Hashtbl.t -> '-> 'c
      val hash : '-> int
      val hash_param : int -> int -> '-> int
      module type HashedType =
        sig
          type t
          val equal :
            ExtHashtbl.Hashtbl.HashedType.t ->
            ExtHashtbl.Hashtbl.HashedType.t -> bool
          val hash : ExtHashtbl.Hashtbl.HashedType.t -> int
        end
      module type S =
        sig
          type key
          type 'a t
          val create : int -> 'ExtHashtbl.Hashtbl.S.t
          val clear : 'ExtHashtbl.Hashtbl.S.t -> unit
          val reset : 'ExtHashtbl.Hashtbl.S.t -> unit
          val copy : 'ExtHashtbl.Hashtbl.S.t -> 'ExtHashtbl.Hashtbl.S.t
          val add :
            'ExtHashtbl.Hashtbl.S.t ->
            ExtHashtbl.Hashtbl.S.key -> '-> unit
          val remove :
            'ExtHashtbl.Hashtbl.S.t -> ExtHashtbl.Hashtbl.S.key -> unit
          val find :
            'ExtHashtbl.Hashtbl.S.t -> ExtHashtbl.Hashtbl.S.key -> 'a
          val find_opt :
            'ExtHashtbl.Hashtbl.S.t ->
            ExtHashtbl.Hashtbl.S.key -> 'a option
          val find_all :
            'ExtHashtbl.Hashtbl.S.t -> ExtHashtbl.Hashtbl.S.key -> 'a list
          val replace :
            'ExtHashtbl.Hashtbl.S.t ->
            ExtHashtbl.Hashtbl.S.key -> '-> unit
          val mem :
            'ExtHashtbl.Hashtbl.S.t -> ExtHashtbl.Hashtbl.S.key -> bool
          val iter :
            (ExtHashtbl.Hashtbl.S.key -> '-> unit) ->
            'ExtHashtbl.Hashtbl.S.t -> unit
          val filter_map_inplace :
            (ExtHashtbl.Hashtbl.S.key -> '-> 'a option) ->
            'ExtHashtbl.Hashtbl.S.t -> unit
          val fold :
            (ExtHashtbl.Hashtbl.S.key -> '-> '-> 'b) ->
            'ExtHashtbl.Hashtbl.S.t -> '-> 'b
          val length : 'ExtHashtbl.Hashtbl.S.t -> int
          val stats :
            'ExtHashtbl.Hashtbl.S.t -> ExtHashtbl.Hashtbl.statistics
        end
      module Make :
        functor (H : 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 iter : (key -> '-> unit) -> 'a t -> unit
            val filter_map_inplace : (key -> '-> 'a option) -> 'a t -> unit
            val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
            val length : 'a t -> int
            val stats : 'a t -> statistics
          end
      module type SeededHashedType =
        sig
          type t
          val equal :
            ExtHashtbl.Hashtbl.SeededHashedType.t ->
            ExtHashtbl.Hashtbl.SeededHashedType.t -> bool
          val hash : int -> ExtHashtbl.Hashtbl.SeededHashedType.t -> int
        end
      module type SeededS =
        sig
          type key
          type 'a t
          val create : ?random:bool -> int -> 'ExtHashtbl.Hashtbl.SeededS.t
          val clear : 'ExtHashtbl.Hashtbl.SeededS.t -> unit
          val reset : 'ExtHashtbl.Hashtbl.SeededS.t -> unit
          val copy :
            'ExtHashtbl.Hashtbl.SeededS.t ->
            'ExtHashtbl.Hashtbl.SeededS.t
          val add :
            'ExtHashtbl.Hashtbl.SeededS.t ->
            ExtHashtbl.Hashtbl.SeededS.key -> '-> unit
          val remove :
            'ExtHashtbl.Hashtbl.SeededS.t ->
            ExtHashtbl.Hashtbl.SeededS.key -> unit
          val find :
            'ExtHashtbl.Hashtbl.SeededS.t ->
            ExtHashtbl.Hashtbl.SeededS.key -> 'a
          val find_opt :
            'ExtHashtbl.Hashtbl.SeededS.t ->
            ExtHashtbl.Hashtbl.SeededS.key -> 'a option
          val find_all :
            'ExtHashtbl.Hashtbl.SeededS.t ->
            ExtHashtbl.Hashtbl.SeededS.key -> 'a list
          val replace :
            'ExtHashtbl.Hashtbl.SeededS.t ->
            ExtHashtbl.Hashtbl.SeededS.key -> '-> unit
          val mem :
            'ExtHashtbl.Hashtbl.SeededS.t ->
            ExtHashtbl.Hashtbl.SeededS.key -> bool
          val iter :
            (ExtHashtbl.Hashtbl.SeededS.key -> '-> unit) ->
            'ExtHashtbl.Hashtbl.SeededS.t -> unit
          val filter_map_inplace :
            (ExtHashtbl.Hashtbl.SeededS.key -> '-> 'a option) ->
            'ExtHashtbl.Hashtbl.SeededS.t -> unit
          val fold :
            (ExtHashtbl.Hashtbl.SeededS.key -> '-> '-> 'b) ->
            'ExtHashtbl.Hashtbl.SeededS.t -> '-> 'b
          val length : 'ExtHashtbl.Hashtbl.SeededS.t -> int
          val stats :
            'ExtHashtbl.Hashtbl.SeededS.t -> ExtHashtbl.Hashtbl.statistics
        end
      module MakeSeeded :
        functor (H : 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 iter : (key -> '-> unit) -> 'a t -> unit
            val filter_map_inplace : (key -> '-> 'a option) -> 'a t -> unit
            val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
            val length : 'a t -> int
            val stats : 'a t -> statistics
          end
    end
end