sig
  module Hashtbl :
    sig
      module type Key = Core_hashtbl_intf.Key
      val hash : '-> int
      val hash_param : int -> int -> '-> int
      module T : sig type ('a, 'b) t = ('a, 'b) Core_hashtbl.T.t end
      type ('a, 'b) t = ('a, 'b) T.t
      val clear : ('a, 'b) T.t -> unit
      val copy : ('a, 'b) T.t -> ('a, 'b) T.t
      val invariant : ('a, 'b) T.t -> unit
      val fold :
        ('a, 'b) T.t ->
        init:'->
        f:(key:'Core_hashtbl_intf.Key_poly.t -> data:'-> '-> 'c) -> 'c
      val iter :
        ('a, 'b) T.t ->
        f:(key:'Core_hashtbl_intf.Key_poly.t -> data:'-> unit) -> unit
      val existsi :
        ('a, 'b) T.t ->
        f:(key:'Core_hashtbl_intf.Key_poly.t -> data:'-> bool) -> bool
      val exists : ('a, 'b) T.t -> f:('-> bool) -> bool
      val length : ('a, 'b) T.t -> int
      val is_empty : ('a, 'b) T.t -> bool
      val mem : ('a, 'b) T.t -> 'Core_hashtbl_intf.Key_poly.t -> bool
      val remove : ('a, 'b) T.t -> 'Core_hashtbl_intf.Key_poly.t -> unit
      val remove_one :
        ('a, 'b list) T.t -> 'Core_hashtbl_intf.Key_poly.t -> unit
      val replace :
        ('a, 'b) T.t ->
        key:'Core_hashtbl_intf.Key_poly.t -> data:'-> unit
      val change :
        ('a, 'b) T.t ->
        'Core_hashtbl_intf.Key_poly.t -> ('b option -> 'b option) -> unit
      val add_multi :
        ('a, 'b list) T.t ->
        key:'Core_hashtbl_intf.Key_poly.t -> data:'-> unit
      val map : ('a, 'b) T.t -> f:('-> 'c) -> ('a, 'c) T.t
      val mapi :
        ('a, 'b) T.t ->
        f:(key:'Core_hashtbl_intf.Key_poly.t -> data:'-> 'c) ->
        ('a, 'c) T.t
      val filter_map : ('a, 'b) T.t -> f:('-> 'c option) -> ('a, 'c) T.t
      val filter_mapi :
        ('a, 'b) T.t ->
        f:(key:'Core_hashtbl_intf.Key_poly.t -> data:'-> 'c option) ->
        ('a, 'c) T.t
      val filter : ('a, 'b) T.t -> f:('-> bool) -> ('a, 'b) T.t
      val filteri :
        ('a, 'b) T.t ->
        f:(key:'Core_hashtbl_intf.Key_poly.t -> data:'-> bool) ->
        ('a, 'b) T.t
      val find_or_add :
        ('a, 'b) T.t ->
        'Core_hashtbl_intf.Key_poly.t -> default:(unit -> 'b) -> 'b
      val find : ('a, 'b) T.t -> 'Core_hashtbl_intf.Key_poly.t -> 'b option
      val find_exn : ('a, 'b) T.t -> 'Core_hashtbl_intf.Key_poly.t -> 'b
      val iter_vals : ('a, 'b) T.t -> f:('-> unit) -> unit
      val merge :
        f:(key:'Core_hashtbl_intf.Key_poly.t ->
           'b option -> 'c option -> 'd option) ->
        ('a, 'b) T.t -> ('a, 'c) T.t -> ('a, 'd) T.t
      val merge_into :
        f:(key:'Core_hashtbl_intf.Key_poly.t ->
           '-> 'b option -> 'b option) ->
        src:('a, 'b) T.t -> dst:('a, 'b) T.t -> unit
      val keys : ('a, 'b) T.t -> 'Core_hashtbl_intf.Key_poly.t list
      val data : ('a, 'b) T.t -> 'b list
      val filter_inplace : ('a, 'b) T.t -> f:('-> bool) -> unit
      val filteri_inplace :
        ('a, 'b) T.t ->
        f:('Core_hashtbl_intf.Key_poly.t -> '-> bool) -> unit
      val equal : ('a, 'b) T.t -> ('a, 'b) T.t -> ('-> '-> bool) -> bool
      val to_alist :
        ('a, 'b) T.t -> ('Core_hashtbl_intf.Key_poly.t * 'b) list
      val incr :
        ?by:int -> ('a, int) T.t -> 'Core_hashtbl_intf.Key_poly.t -> unit
      type ('a, 'b) binable = ('a, 'b) t
      val bin_size_t : ('a, 'b, ('a, 'b) binable) Bin_prot.Size.sizer2
      val bin_write_t :
        ('a, 'b, ('a, 'b) binable) Bin_prot.Map_to_safe.writer2
      val bin_write_t_ :
        ('a, 'b, ('a, 'b) binable) Bin_prot.Unsafe_write_c.writer2
      val bin_read_t :
        ('a, 'b, ('a, 'b) binable) Bin_prot.Map_to_safe.reader2
      val bin_read_t_ :
        ('a, 'b, ('a, 'b) binable) Bin_prot.Unsafe_read_c.reader2
      val bin_read_t__ :
        ('a, 'b, int -> ('a, 'b) binable) Bin_prot.Unsafe_read_c.reader2
      val bin_writer_t :
        ('a, 'b, ('a, 'b) binable) Bin_prot.Type_class.S2.writer
      val bin_reader_t :
        ('a, 'b, ('a, 'b) binable) Bin_prot.Type_class.S2.reader
      val bin_t : ('a, 'b, ('a, 'b) binable) Bin_prot.Type_class.S2.t
      type ('a, 'b) sexpable = ('a, 'b) t
      val sexp_of_t :
        ('-> Sexplib.Sexp.t) ->
        ('-> Sexplib.Sexp.t) -> ('a, 'b) sexpable -> Sexplib.Sexp.t
      val t_of_sexp :
        (Sexplib.Sexp.t -> 'a) ->
        (Sexplib.Sexp.t -> 'b) -> Sexplib.Sexp.t -> ('a, 'b) sexpable
      module Poly :
        sig
          type ('a, 'b) binable = ('a, 'b) t
          val bin_size_t : ('a, 'b, ('a, 'b) binable) Bin_prot.Size.sizer2
          val bin_write_t :
            ('a, 'b, ('a, 'b) binable) Bin_prot.Map_to_safe.writer2
          val bin_write_t_ :
            ('a, 'b, ('a, 'b) binable) Bin_prot.Unsafe_write_c.writer2
          val bin_read_t :
            ('a, 'b, ('a, 'b) binable) Bin_prot.Map_to_safe.reader2
          val bin_read_t_ :
            ('a, 'b, ('a, 'b) binable) Bin_prot.Unsafe_read_c.reader2
          val bin_read_t__ :
            ('a, 'b, int -> ('a, 'b) binable) Bin_prot.Unsafe_read_c.reader2
          val bin_writer_t :
            ('a, 'b, ('a, 'b) binable) Bin_prot.Type_class.S2.writer
          val bin_reader_t :
            ('a, 'b, ('a, 'b) binable) Bin_prot.Type_class.S2.reader
          val bin_t : ('a, 'b, ('a, 'b) binable) Bin_prot.Type_class.S2.t
          type ('a, 'b) sexpable = ('a, 'b) t
          val sexp_of_t :
            ('-> Sexplib.Sexp.t) ->
            ('-> Sexplib.Sexp.t) -> ('a, 'b) sexpable -> Sexplib.Sexp.t
          val t_of_sexp :
            (Sexplib.Sexp.t -> 'a) ->
            (Sexplib.Sexp.t -> 'b) -> Sexplib.Sexp.t -> ('a, 'b) sexpable
          val create : (unit -> ('a, 'b) T.t) Core_hashtbl_intf.with_options
          val of_alist :
            (('Core_hashtbl_intf.Key_poly.t * 'b) list ->
             [ `Duplicate_key of 'Core_hashtbl_intf.Key_poly.t
             | `Ok of ('a, 'b) T.t ])
            Core_hashtbl_intf.with_options
          val of_alist_exn :
            (('Core_hashtbl_intf.Key_poly.t * 'b) list -> ('a, 'b) T.t)
            Core_hashtbl_intf.with_options
          val of_alist_multi :
            (('Core_hashtbl_intf.Key_poly.t * 'b) list -> ('a, 'b list) T.t)
            Core_hashtbl_intf.with_options
          val create_mapped :
            (get_key:('-> 'Core_hashtbl_intf.Key_poly.t) ->
             get_data:('-> 'c) -> 'a list -> ('b, 'c) T.t)
            Core_hashtbl_intf.with_options
          val create_with_key :
            (get_key:('-> 'Core_hashtbl_intf.Key_poly.t) ->
             'a list -> ('b, 'a) T.t)
            Core_hashtbl_intf.with_options
          val group :
            (get_key:('-> 'Core_hashtbl_intf.Key_poly.t) ->
             get_data:('-> 'c) ->
             combine:('-> '-> 'c) -> 'a list -> ('b, 'c) T.t)
            Core_hashtbl_intf.with_options
        end
      module Make :
        functor (Key : Key->
          sig
            module Key : sig type t = Key.t end
            val hashable : Key.t Core_hashtbl_intf.hashable
            type 'a t = (Key.t, 'a) Core_hashtbl_intf.Monomorphic(T)(Key).T.t
            val clear :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t -> unit
            val copy :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t
            val invariant :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t -> unit
            val fold :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              init:'->
              f:(key:'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 data:'-> '-> 'c) ->
              'c
            val iter :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:(key:'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 data:'-> unit) ->
              unit
            val existsi :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:(key:'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 data:'-> bool) ->
              bool
            val exists :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:('-> bool) -> bool
            val length :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t -> int
            val is_empty :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t -> bool
            val mem :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t -> bool
            val remove :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t -> unit
            val remove_one :
              ('a, 'b list) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t -> unit
            val replace :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              key:'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
              data:'-> unit
            val change :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
              ('b option -> 'b option) -> unit
            val add_multi :
              ('a, 'b list) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              key:'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
              data:'-> unit
            val map :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:('-> 'c) ->
              ('a, 'c) Core_hashtbl_intf.Monomorphic(T)(Key).T.t
            val mapi :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:(key:'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 data:'-> 'c) ->
              ('a, 'c) Core_hashtbl_intf.Monomorphic(T)(Key).T.t
            val filter_map :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:('-> 'c option) ->
              ('a, 'c) Core_hashtbl_intf.Monomorphic(T)(Key).T.t
            val filter_mapi :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:(key:'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 data:'-> 'c option) ->
              ('a, 'c) Core_hashtbl_intf.Monomorphic(T)(Key).T.t
            val filter :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:('-> bool) ->
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t
            val filteri :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:(key:'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 data:'-> bool) ->
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t
            val find_or_add :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
              default:(unit -> 'b) -> 'b
            val find :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t -> 'b option
            val find_exn :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t -> 'b
            val iter_vals :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:('-> unit) -> unit
            val merge :
              f:(key:'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 'b option -> 'c option -> 'd option) ->
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              ('a, 'c) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              ('a, 'd) Core_hashtbl_intf.Monomorphic(T)(Key).T.t
            val merge_into :
              f:(key:'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 '-> 'b option -> 'b option) ->
              src:('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              dst:('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t -> unit
            val keys :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t list
            val data :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t -> 'b list
            val filter_inplace :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:('-> bool) -> unit
            val filteri_inplace :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:('Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 '-> bool) ->
              unit
            val equal :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              ('-> '-> bool) -> bool
            val to_alist :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              ('Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t * 'b) list
            val incr :
              ?by:int ->
              ('a, int) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t -> unit
            val create :
              (unit -> ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t)
              Core_hashtbl_intf.with_options
            val of_alist :
              (('Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t * 'b) list ->
               [ `Duplicate_key of
                   'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t
               | `Ok of ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ])
              Core_hashtbl_intf.with_options
            val of_alist_exn :
              (('Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t * 'b) list ->
               ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t)
              Core_hashtbl_intf.with_options
            val of_alist_multi :
              (('Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t * 'b) list ->
               ('a, 'b list) Core_hashtbl_intf.Monomorphic(T)(Key).T.t)
              Core_hashtbl_intf.with_options
            val create_mapped :
              (get_key:('-> 'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t) ->
               get_data:('-> 'c) ->
               'a list -> ('b, 'c) Core_hashtbl_intf.Monomorphic(T)(Key).T.t)
              Core_hashtbl_intf.with_options
            val create_with_key :
              (get_key:('-> 'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t) ->
               'a list -> ('b, 'a) Core_hashtbl_intf.Monomorphic(T)(Key).T.t)
              Core_hashtbl_intf.with_options
            val group :
              (get_key:('-> 'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t) ->
               get_data:('-> 'c) ->
               combine:('-> '-> 'c) ->
               'a list -> ('b, 'c) Core_hashtbl_intf.Monomorphic(T)(Key).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
          end
      module Make_binable :
        functor
          (Key : sig
                   type t
                   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
                   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
                 end->
          sig
            module Key : sig type t = Key.t end
            val hashable : Key.t Core_hashtbl_intf.hashable
            type 'a t = (Key.t, 'a) Core_hashtbl_intf.Monomorphic(T)(Key).T.t
            val clear :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t -> unit
            val copy :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t
            val invariant :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t -> unit
            val fold :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              init:'->
              f:(key:'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 data:'-> '-> 'c) ->
              'c
            val iter :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:(key:'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 data:'-> unit) ->
              unit
            val existsi :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:(key:'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 data:'-> bool) ->
              bool
            val exists :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:('-> bool) -> bool
            val length :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t -> int
            val is_empty :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t -> bool
            val mem :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t -> bool
            val remove :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t -> unit
            val remove_one :
              ('a, 'b list) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t -> unit
            val replace :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              key:'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
              data:'-> unit
            val change :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
              ('b option -> 'b option) -> unit
            val add_multi :
              ('a, 'b list) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              key:'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
              data:'-> unit
            val map :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:('-> 'c) ->
              ('a, 'c) Core_hashtbl_intf.Monomorphic(T)(Key).T.t
            val mapi :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:(key:'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 data:'-> 'c) ->
              ('a, 'c) Core_hashtbl_intf.Monomorphic(T)(Key).T.t
            val filter_map :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:('-> 'c option) ->
              ('a, 'c) Core_hashtbl_intf.Monomorphic(T)(Key).T.t
            val filter_mapi :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:(key:'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 data:'-> 'c option) ->
              ('a, 'c) Core_hashtbl_intf.Monomorphic(T)(Key).T.t
            val filter :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:('-> bool) ->
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t
            val filteri :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:(key:'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 data:'-> bool) ->
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t
            val find_or_add :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
              default:(unit -> 'b) -> 'b
            val find :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t -> 'b option
            val find_exn :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t -> 'b
            val iter_vals :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:('-> unit) -> unit
            val merge :
              f:(key:'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 'b option -> 'c option -> 'd option) ->
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              ('a, 'c) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              ('a, 'd) Core_hashtbl_intf.Monomorphic(T)(Key).T.t
            val merge_into :
              f:(key:'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 '-> 'b option -> 'b option) ->
              src:('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              dst:('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t -> unit
            val keys :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t list
            val data :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t -> 'b list
            val filter_inplace :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:('-> bool) -> unit
            val filteri_inplace :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:('Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 '-> bool) ->
              unit
            val equal :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              ('-> '-> bool) -> bool
            val to_alist :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              ('Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t * 'b) list
            val incr :
              ?by:int ->
              ('a, int) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t -> unit
            val create :
              (unit -> ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t)
              Core_hashtbl_intf.with_options
            val of_alist :
              (('Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t * 'b) list ->
               [ `Duplicate_key of
                   'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t
               | `Ok of ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ])
              Core_hashtbl_intf.with_options
            val of_alist_exn :
              (('Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t * 'b) list ->
               ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t)
              Core_hashtbl_intf.with_options
            val of_alist_multi :
              (('Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t * 'b) list ->
               ('a, 'b list) Core_hashtbl_intf.Monomorphic(T)(Key).T.t)
              Core_hashtbl_intf.with_options
            val create_mapped :
              (get_key:('-> 'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t) ->
               get_data:('-> 'c) ->
               'a list -> ('b, 'c) Core_hashtbl_intf.Monomorphic(T)(Key).T.t)
              Core_hashtbl_intf.with_options
            val create_with_key :
              (get_key:('-> 'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t) ->
               'a list -> ('b, 'a) Core_hashtbl_intf.Monomorphic(T)(Key).T.t)
              Core_hashtbl_intf.with_options
            val group :
              (get_key:('-> 'Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t) ->
               get_data:('-> 'c) ->
               combine:('-> '-> 'c) ->
               'a list -> ('b, 'c) Core_hashtbl_intf.Monomorphic(T)(Key).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
    end
  module type Key = Hashtbl.Key
  module type S =
    sig
      module Key : Key
      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
  module Make :
    functor (Key : Key->
      sig
        module Key :
          sig
            type t = Key.t
            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 = 'Hash_heap.Make(Key).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