sig
  type hashable
  module Hashable : sig type t = Hashable.S_binable.hashable end
  val hash : Hashable.S_binable.hashable -> int
  module Table :
    sig
      module Key : sig type t = Hashable.t end
      val hashable : Key.t Core_hashtbl_intf.hashable
      type 'a t =
          (Key.t, 'a) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t
      val clear :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t -> unit
      val copy :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t
      val invariant :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t -> unit
      val fold :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        init:'->
        f:(key:'Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
           data:'-> '-> 'c) ->
        'c
      val iter :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        f:(key:'Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
           data:'-> unit) ->
        unit
      val existsi :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        f:(key:'Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
           data:'-> bool) ->
        bool
      val exists :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        f:('-> bool) -> bool
      val length :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t -> int
      val is_empty :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t -> bool
      val mem :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        'Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t -> bool
      val remove :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        'Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t -> unit
      val remove_one :
        ('a, 'b list) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        'Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t -> unit
      val replace :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        key:'Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
        data:'-> unit
      val change :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        'Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
        ('b option -> 'b option) -> unit
      val add_multi :
        ('a, 'b list) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        key:'Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
        data:'-> unit
      val map :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        f:('-> 'c) ->
        ('a, 'c) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t
      val mapi :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        f:(key:'Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
           data:'-> 'c) ->
        ('a, 'c) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t
      val filter_map :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        f:('-> 'c option) ->
        ('a, 'c) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t
      val filter_mapi :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        f:(key:'Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
           data:'-> 'c option) ->
        ('a, 'c) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t
      val filter :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        f:('-> bool) ->
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t
      val filteri :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        f:(key:'Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
           data:'-> bool) ->
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t
      val find_or_add :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        'Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
        default:(unit -> 'b) -> 'b
      val find :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        'Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
        'b option
      val find_exn :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        'Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t -> 'b
      val iter_vals :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        f:('-> unit) -> unit
      val merge :
        f:(key:'Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
           'b option -> 'c option -> 'd option) ->
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        ('a, 'c) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        ('a, 'd) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t
      val merge_into :
        f:(key:'Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
           '-> 'b option -> 'b option) ->
        src:('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        dst:('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        unit
      val keys :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        'Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t list
      val data :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        'b list
      val filter_inplace :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        f:('-> bool) -> unit
      val filteri_inplace :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        f:('Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
           '-> bool) ->
        unit
      val equal :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        ('-> '-> bool) -> bool
      val to_alist :
        ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        ('Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t * 'b)
        list
      val incr :
        ?by:int ->
        ('a, int) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
        'Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t -> unit
      val create :
        (unit ->
         ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t)
        Core_hashtbl_intf.with_options
      val of_alist :
        (('Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t * 'b)
         list ->
         [ `Duplicate_key of
             'Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t
         | `Ok of
             ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ])
        Core_hashtbl_intf.with_options
      val of_alist_exn :
        (('Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t * 'b)
         list ->
         ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t)
        Core_hashtbl_intf.with_options
      val of_alist_multi :
        (('Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t * 'b)
         list ->
         ('a, 'b list) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t)
        Core_hashtbl_intf.with_options
      val create_mapped :
        (get_key:('->
                  'Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t) ->
         get_data:('-> 'c) ->
         'a list ->
         ('b, 'c) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t)
        Core_hashtbl_intf.with_options
      val create_with_key :
        (get_key:('->
                  'Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t) ->
         'a list ->
         ('b, 'a) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t)
        Core_hashtbl_intf.with_options
      val group :
        (get_key:('->
                  'Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t) ->
         get_data:('-> 'c) ->
         combine:('-> '-> 'c) ->
         'a list ->
         ('b, 'c) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t)
        Core_hashtbl_intf.with_options
      type 'a sexpable = 'a t
      val sexp_of_t : ('-> Sexplib.Sexp.t) -> 'a sexpable -> Sexplib.Sexp.t
      val t_of_sexp : (Sexplib.Sexp.t -> 'a) -> Sexplib.Sexp.t -> 'a sexpable
      type 'a binable = 'a t
      val bin_size_t : ('a, 'a binable) Bin_prot.Size.sizer1
      val bin_write_t : ('a, 'a binable) Bin_prot.Map_to_safe.writer1
      val bin_write_t_ : ('a, 'a binable) Bin_prot.Unsafe_write_c.writer1
      val bin_read_t : ('a, 'a binable) Bin_prot.Map_to_safe.reader1
      val bin_read_t_ : ('a, 'a binable) Bin_prot.Unsafe_read_c.reader1
      val bin_read_t__ :
        ('a, int -> 'a binable) Bin_prot.Unsafe_read_c.reader1
      val bin_writer_t : ('a, 'a binable) Bin_prot.Type_class.S1.writer
      val bin_reader_t : ('a, 'a binable) Bin_prot.Type_class.S1.reader
      val bin_t : ('a, 'a binable) Bin_prot.Type_class.S1.t
    end
  module Hash_set :
    sig
      type elem = hashable
      type t = elem Hash_set.t
      type sexpable = t
      val sexp_of_t : sexpable -> Sexplib.Sexp.t
      val t_of_sexp : Sexplib.Sexp.t -> sexpable
      type binable = t
      val bin_size_t : binable Bin_prot.Size.sizer
      val bin_write_t : binable Bin_prot.Map_to_safe.writer
      val bin_write_t_ : binable Bin_prot.Unsafe_write_c.writer
      val bin_read_t : binable Bin_prot.Read_ml.reader
      val bin_read_t_ : binable Bin_prot.Unsafe_read_c.reader
      val bin_read_t__ : (int -> binable) Bin_prot.Unsafe_read_c.reader
      val bin_writer_t : binable Bin_prot.Type_class.writer
      val bin_reader_t : binable Bin_prot.Type_class.reader
      val bin_t : binable Bin_prot.Type_class.t
      val create : ?growth_allowed:bool -> ?size:int -> unit -> t
      val of_list : elem list -> t
    end
  module Hash_queue :
    sig
      module Key :
        sig
          type t = hashable
          val compare : t -> t -> int
          val hash : t -> int
          type sexpable = t
          val sexp_of_t : sexpable -> Sexplib.Sexp.t
          val t_of_sexp : Sexplib.Sexp.t -> sexpable
        end
      type 'a t
      type 'a container = 'a t
      val length : 'a container -> int
      val is_empty : 'a container -> bool
      val iter : 'a container -> f:('-> unit) -> unit
      val fold : 'a container -> init:'-> f:('-> '-> 'b) -> 'b
      val exists : 'a container -> f:('-> bool) -> bool
      val for_all : 'a container -> f:('-> bool) -> bool
      val find : 'a container -> f:('-> bool) -> 'a option
      val to_list : 'a container -> 'a list
      val to_array : 'a container -> 'a array
      val container : ('a, 'a container) Container.type_class
      val invariant : 'a t -> unit
      val create : unit -> 'a t
      val clear : 'a t -> unit
      val mem : 'a t -> Key.t -> bool
      val lookup : 'a t -> Key.t -> 'a option
      val lookup_exn : 'a t -> Key.t -> 'a
      val enqueue : 'a t -> Key.t -> '-> [ `Key_already_present | `Ok ]
      val enqueue_exn : 'a t -> Key.t -> '-> unit
      val keys : 'a t -> Key.t list
      val dequeue : 'a t -> 'a option
      val dequeue_exn : 'a t -> 'a
      val dequeue_with_key : 'a t -> (Key.t * 'a) option
      val dequeue_with_key_exn : 'a t -> Key.t * 'a
      val dequeue_all : 'a t -> f:('-> unit) -> unit
      val remove : 'a t -> Key.t -> [ `No_such_key | `Ok ]
      val remove_exn : 'a t -> Key.t -> unit
      val replace : 'a t -> Key.t -> '-> [ `No_such_key | `Ok ]
      val replace_exn : 'a t -> Key.t -> '-> unit
      val iteri : 'a t -> f:(key:Key.t -> data:'-> unit) -> unit
      val foldi :
        'a t -> init:'-> f:('-> key:Key.t -> data:'-> 'b) -> 'b
    end
  module Hash_heap :
    sig
      module Key :
        sig
          type t = hashable
          val compare : t -> t -> int
          val hash : t -> int
          type sexpable = t
          val sexp_of_t : sexpable -> Sexplib.Sexp.t
          val t_of_sexp : Sexplib.Sexp.t -> sexpable
        end
      type 'a t
      val create : ?min_size:int -> ('-> '-> int) -> 'a t
      val copy : 'a t -> 'a t
      val push :
        'a t -> key:Key.t -> data:'-> [ `Key_already_present | `Ok ]
      val push_exn : 'a t -> key:Key.t -> data:'-> unit
      val replace : 'a t -> key:Key.t -> data:'-> unit
      val remove : 'a t -> Key.t -> unit
      val mem : 'a t -> Key.t -> bool
      val top : 'a t -> 'a option
      val top_exn : 'a t -> 'a
      val top_with_key : 'a t -> (Key.t * 'a) option
      val top_with_key_exn : 'a t -> Key.t * 'a
      val pop_with_key : 'a t -> (Key.t * 'a) option
      val pop_with_key_exn : 'a t -> Key.t * 'a
      val pop : 'a t -> 'a option
      val pop_exn : 'a t -> 'a
      val cond_pop_with_key :
        'a t -> (key:Key.t -> data:'-> bool) -> (Key.t * 'a) option
      val cond_pop : 'a t -> ('-> bool) -> 'a option
      val find : 'a t -> Key.t -> 'a option
      val find_pop : 'a t -> Key.t -> 'a option
      val find_exn : 'a t -> Key.t -> 'a
      val find_pop_exn : 'a t -> Key.t -> 'a
      val iter : 'a t -> f:(key:Key.t -> data:'-> unit) -> unit
      val iter_vals : 'a t -> f:('-> unit) -> unit
    end
end