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 Table_sig :
    functor (Key : Core_hashtbl_intf.T0->
      sig
        module T : sig type ('a, 'b) t = (Key.t, 'b) Hashtbl.t end
        module Key1 : sig type 'a t = Key.t end
        module type S =
          sig
            module Key : sig type t = Key.t end
            val hashable : Key.t Core_hashtbl_intf.hashable
            type 'a t = (Key.t, 'a) 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:'Key1.t -> data:'-> '-> 'c) -> 'c
            val iter :
              ('a, 'b) T.t -> f:(key:'Key1.t -> data:'-> unit) -> unit
            val existsi :
              ('a, 'b) T.t -> f:(key:'Key1.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 -> 'Key1.t -> bool
            val remove : ('a, 'b) T.t -> 'Key1.t -> unit
            val remove_one : ('a, 'b list) T.t -> 'Key1.t -> unit
            val replace : ('a, 'b) T.t -> key:'Key1.t -> data:'-> unit
            val change :
              ('a, 'b) T.t -> 'Key1.t -> ('b option -> 'b option) -> unit
            val add_multi :
              ('a, 'b list) T.t -> key:'Key1.t -> data:'-> unit
            val map : ('a, 'b) T.t -> f:('-> 'c) -> ('a, 'c) T.t
            val mapi :
              ('a, 'b) T.t ->
              f:(key:'Key1.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:'Key1.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:'Key1.t -> data:'-> bool) -> ('a, 'b) T.t
            val find_or_add :
              ('a, 'b) T.t -> 'Key1.t -> default:(unit -> 'b) -> 'b
            val find : ('a, 'b) T.t -> 'Key1.t -> 'b option
            val find_exn : ('a, 'b) T.t -> 'Key1.t -> 'b
            val iter_vals : ('a, 'b) T.t -> f:('-> unit) -> unit
            val merge :
              f:(key:'Key1.t -> 'b option -> 'c option -> 'd option) ->
              ('a, 'b) T.t -> ('a, 'c) T.t -> ('a, 'd) T.t
            val merge_into :
              f:(key:'Key1.t -> '-> 'b option -> 'b option) ->
              src:('a, 'b) T.t -> dst:('a, 'b) T.t -> unit
            val keys : ('a, 'b) T.t -> 'Key1.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:('Key1.t -> '-> bool) -> unit
            val equal :
              ('a, 'b) T.t -> ('a, 'b) T.t -> ('-> '-> bool) -> bool
            val to_alist : ('a, 'b) T.t -> ('Key1.t * 'b) list
            val incr : ?by:int -> ('a, int) T.t -> 'Key1.t -> unit
            val create :
              (unit -> ('a, 'b) T.t) Core_hashtbl_intf.with_options
            val of_alist :
              (('Key1.t * 'b) list ->
               [ `Duplicate_key of 'Key1.t | `Ok of ('a, 'b) T.t ])
              Core_hashtbl_intf.with_options
            val of_alist_exn :
              (('Key1.t * 'b) list -> ('a, 'b) T.t)
              Core_hashtbl_intf.with_options
            val of_alist_multi :
              (('Key1.t * 'b) list -> ('a, 'b list) T.t)
              Core_hashtbl_intf.with_options
            val create_mapped :
              (get_key:('-> 'Key1.t) ->
               get_data:('-> 'c) -> 'a list -> ('b, 'c) T.t)
              Core_hashtbl_intf.with_options
            val create_with_key :
              (get_key:('-> 'Key1.t) -> 'a list -> ('b, 'a) T.t)
              Core_hashtbl_intf.with_options
            val group :
              (get_key:('-> 'Key1.t) ->
               get_data:('-> 'c) ->
               combine:('-> '-> 'c) -> 'a list -> ('b, 'c) 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
      end
  module type S =
    sig
      type hashable
      module Hashable : sig type t = hashable end
      val hash : hashable -> int
      module Table : Table_sig(Hashable).S
      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
          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
  module Make :
    functor (T : Hashtbl.Key->
      sig
        type hashable = T.t
        module Hashable : sig type t = hashable end
        val hash : 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) Table_sig(Hashable).T.t
            val clear : ('a, 'b) Table_sig(Hashable).T.t -> unit
            val copy :
              ('a, 'b) Table_sig(Hashable).T.t ->
              ('a, 'b) Table_sig(Hashable).T.t
            val invariant : ('a, 'b) Table_sig(Hashable).T.t -> unit
            val fold :
              ('a, 'b) Table_sig(Hashable).T.t ->
              init:'->
              f:(key:'Table_sig(Hashable).Key1.t -> data:'-> '-> 'c) ->
              'c
            val iter :
              ('a, 'b) Table_sig(Hashable).T.t ->
              f:(key:'Table_sig(Hashable).Key1.t -> data:'-> unit) ->
              unit
            val existsi :
              ('a, 'b) Table_sig(Hashable).T.t ->
              f:(key:'Table_sig(Hashable).Key1.t -> data:'-> bool) ->
              bool
            val exists :
              ('a, 'b) Table_sig(Hashable).T.t -> f:('-> bool) -> bool
            val length : ('a, 'b) Table_sig(Hashable).T.t -> int
            val is_empty : ('a, 'b) Table_sig(Hashable).T.t -> bool
            val mem :
              ('a, 'b) Table_sig(Hashable).T.t ->
              'Table_sig(Hashable).Key1.t -> bool
            val remove :
              ('a, 'b) Table_sig(Hashable).T.t ->
              'Table_sig(Hashable).Key1.t -> unit
            val remove_one :
              ('a, 'b list) Table_sig(Hashable).T.t ->
              'Table_sig(Hashable).Key1.t -> unit
            val replace :
              ('a, 'b) Table_sig(Hashable).T.t ->
              key:'Table_sig(Hashable).Key1.t -> data:'-> unit
            val change :
              ('a, 'b) Table_sig(Hashable).T.t ->
              'Table_sig(Hashable).Key1.t ->
              ('b option -> 'b option) -> unit
            val add_multi :
              ('a, 'b list) Table_sig(Hashable).T.t ->
              key:'Table_sig(Hashable).Key1.t -> data:'-> unit
            val map :
              ('a, 'b) Table_sig(Hashable).T.t ->
              f:('-> 'c) -> ('a, 'c) Table_sig(Hashable).T.t
            val mapi :
              ('a, 'b) Table_sig(Hashable).T.t ->
              f:(key:'Table_sig(Hashable).Key1.t -> data:'-> 'c) ->
              ('a, 'c) Table_sig(Hashable).T.t
            val filter_map :
              ('a, 'b) Table_sig(Hashable).T.t ->
              f:('-> 'c option) -> ('a, 'c) Table_sig(Hashable).T.t
            val filter_mapi :
              ('a, 'b) Table_sig(Hashable).T.t ->
              f:(key:'Table_sig(Hashable).Key1.t -> data:'-> 'c option) ->
              ('a, 'c) Table_sig(Hashable).T.t
            val filter :
              ('a, 'b) Table_sig(Hashable).T.t ->
              f:('-> bool) -> ('a, 'b) Table_sig(Hashable).T.t
            val filteri :
              ('a, 'b) Table_sig(Hashable).T.t ->
              f:(key:'Table_sig(Hashable).Key1.t -> data:'-> bool) ->
              ('a, 'b) Table_sig(Hashable).T.t
            val find_or_add :
              ('a, 'b) Table_sig(Hashable).T.t ->
              'Table_sig(Hashable).Key1.t -> default:(unit -> 'b) -> 'b
            val find :
              ('a, 'b) Table_sig(Hashable).T.t ->
              'Table_sig(Hashable).Key1.t -> 'b option
            val find_exn :
              ('a, 'b) Table_sig(Hashable).T.t ->
              'Table_sig(Hashable).Key1.t -> 'b
            val iter_vals :
              ('a, 'b) Table_sig(Hashable).T.t -> f:('-> unit) -> unit
            val merge :
              f:(key:'Table_sig(Hashable).Key1.t ->
                 'b option -> 'c option -> 'd option) ->
              ('a, 'b) Table_sig(Hashable).T.t ->
              ('a, 'c) Table_sig(Hashable).T.t ->
              ('a, 'd) Table_sig(Hashable).T.t
            val merge_into :
              f:(key:'Table_sig(Hashable).Key1.t ->
                 '-> 'b option -> 'b option) ->
              src:('a, 'b) Table_sig(Hashable).T.t ->
              dst:('a, 'b) Table_sig(Hashable).T.t -> unit
            val keys :
              ('a, 'b) Table_sig(Hashable).T.t ->
              'Table_sig(Hashable).Key1.t list
            val data : ('a, 'b) Table_sig(Hashable).T.t -> 'b list
            val filter_inplace :
              ('a, 'b) Table_sig(Hashable).T.t -> f:('-> bool) -> unit
            val filteri_inplace :
              ('a, 'b) Table_sig(Hashable).T.t ->
              f:('Table_sig(Hashable).Key1.t -> '-> bool) -> unit
            val equal :
              ('a, 'b) Table_sig(Hashable).T.t ->
              ('a, 'b) Table_sig(Hashable).T.t -> ('-> '-> bool) -> bool
            val to_alist :
              ('a, 'b) Table_sig(Hashable).T.t ->
              ('Table_sig(Hashable).Key1.t * 'b) list
            val incr :
              ?by:int ->
              ('a, int) Table_sig(Hashable).T.t ->
              'Table_sig(Hashable).Key1.t -> unit
            val create :
              (unit -> ('a, 'b) Table_sig(Hashable).T.t)
              Core_hashtbl_intf.with_options
            val of_alist :
              (('Table_sig(Hashable).Key1.t * 'b) list ->
               [ `Duplicate_key of 'Table_sig(Hashable).Key1.t
               | `Ok of ('a, 'b) Table_sig(Hashable).T.t ])
              Core_hashtbl_intf.with_options
            val of_alist_exn :
              (('Table_sig(Hashable).Key1.t * 'b) list ->
               ('a, 'b) Table_sig(Hashable).T.t)
              Core_hashtbl_intf.with_options
            val of_alist_multi :
              (('Table_sig(Hashable).Key1.t * 'b) list ->
               ('a, 'b list) Table_sig(Hashable).T.t)
              Core_hashtbl_intf.with_options
            val create_mapped :
              (get_key:('-> 'Table_sig(Hashable).Key1.t) ->
               get_data:('-> 'c) ->
               'a list -> ('b, 'c) Table_sig(Hashable).T.t)
              Core_hashtbl_intf.with_options
            val create_with_key :
              (get_key:('-> 'Table_sig(Hashable).Key1.t) ->
               'a list -> ('b, 'a) Table_sig(Hashable).T.t)
              Core_hashtbl_intf.with_options
            val group :
              (get_key:('-> 'Table_sig(Hashable).Key1.t) ->
               get_data:('-> 'c) ->
               combine:('-> '-> 'c) ->
               'a list -> ('b, 'c) Table_sig(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
          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
            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 = 'Hashable.Make(T).Hash_queue.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 = 'Hashable.Make(T).Hash_heap.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
  module type S_binable =
    sig
      type hashable
      module Hashable : sig type t = hashable end
      val hash : 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:('->
                      'b
                      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:('->
                      'b
                      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:('->
                      'b
                      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
  module Make_binable :
    functor
      (T : 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
        type hashable = T.t
        module Hashable : sig type t = hashable end
        val hash : 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:'a
                     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:'a
                     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:'a
                     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:'a
                     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:'a
                     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:'a
                     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:'a
                     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:'a
                     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:('->
                        'b
                        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:('->
                        'b
                        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:('->
                        'b
                        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 = 'Hashable.Make_binable(T).Hash_queue.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 = 'Hashable.Make_binable(T).Hash_heap.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
end