sig
  module Hashtbl :
    sig
      module type Key = Core_hashtbl_intf.Key
      val hash : 'a -> int
      val hash_param : int -> int -> 'a -> 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:'c ->
        f:(key:'a Core_hashtbl_intf.Key_poly.t -> data:'b -> 'c -> 'c) -> 'c
      val iter :
        ('a, 'b) T.t ->
        f:(key:'a Core_hashtbl_intf.Key_poly.t -> data:'b -> unit) -> unit
      val existsi :
        ('a, 'b) T.t ->
        f:(key:'a Core_hashtbl_intf.Key_poly.t -> data:'b -> bool) -> bool
      val exists : ('a, 'b) T.t -> f:('b -> bool) -> bool
      val length : ('a, 'b) T.t -> int
      val is_empty : ('a, 'b) T.t -> bool
      val mem : ('a, 'b) T.t -> 'a Core_hashtbl_intf.Key_poly.t -> bool
      val remove : ('a, 'b) T.t -> 'a Core_hashtbl_intf.Key_poly.t -> unit
      val remove_one :
        ('a, 'b list) T.t -> 'a Core_hashtbl_intf.Key_poly.t -> unit
      val replace :
        ('a, 'b) T.t ->
        key:'a Core_hashtbl_intf.Key_poly.t -> data:'b -> unit
      val change :
        ('a, 'b) T.t ->
        'a Core_hashtbl_intf.Key_poly.t -> ('b option -> 'b option) -> unit
      val add_multi :
        ('a, 'b list) T.t ->
        key:'a Core_hashtbl_intf.Key_poly.t -> data:'b -> unit
      val map : ('a, 'b) T.t -> f:('b -> 'c) -> ('a, 'c) T.t
      val mapi :
        ('a, 'b) T.t ->
        f:(key:'a Core_hashtbl_intf.Key_poly.t -> data:'b -> 'c) ->
        ('a, 'c) T.t
      val filter_map : ('a, 'b) T.t -> f:('b -> 'c option) -> ('a, 'c) T.t
      val filter_mapi :
        ('a, 'b) T.t ->
        f:(key:'a Core_hashtbl_intf.Key_poly.t -> data:'b -> 'c option) ->
        ('a, 'c) T.t
      val filter : ('a, 'b) T.t -> f:('b -> bool) -> ('a, 'b) T.t
      val filteri :
        ('a, 'b) T.t ->
        f:(key:'a Core_hashtbl_intf.Key_poly.t -> data:'b -> bool) ->
        ('a, 'b) T.t
      val find_or_add :
        ('a, 'b) T.t ->
        'a Core_hashtbl_intf.Key_poly.t -> default:(unit -> 'b) -> 'b
      val find : ('a, 'b) T.t -> 'a Core_hashtbl_intf.Key_poly.t -> 'b option
      val find_exn : ('a, 'b) T.t -> 'a Core_hashtbl_intf.Key_poly.t -> 'b
      val iter_vals : ('a, 'b) T.t -> f:('b -> unit) -> unit
      val merge :
        f:(key:'a 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:'a Core_hashtbl_intf.Key_poly.t ->
           'b -> 'b option -> 'b option) ->
        src:('a, 'b) T.t -> dst:('a, 'b) T.t -> unit
      val keys : ('a, 'b) T.t -> 'a Core_hashtbl_intf.Key_poly.t list
      val data : ('a, 'b) T.t -> 'b list
      val filter_inplace : ('a, 'b) T.t -> f:('b -> bool) -> unit
      val filteri_inplace :
        ('a, 'b) T.t ->
        f:('a Core_hashtbl_intf.Key_poly.t -> 'b -> bool) -> unit
      val equal : ('a, 'b) T.t -> ('a, 'b) T.t -> ('b -> 'b -> bool) -> bool
      val to_alist :
        ('a, 'b) T.t -> ('a Core_hashtbl_intf.Key_poly.t * 'b) list
      val incr :
        ?by:int -> ('a, int) T.t -> 'a 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 :
        ('a -> Sexplib.Sexp.t) ->
        ('b -> 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 :
            ('a -> Sexplib.Sexp.t) ->
            ('b -> 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 :
            (('a Core_hashtbl_intf.Key_poly.t * 'b) list ->
             [ `Duplicate_key of 'a Core_hashtbl_intf.Key_poly.t
             | `Ok of ('a, 'b) T.t ])
            Core_hashtbl_intf.with_options
          val of_alist_exn :
            (('a Core_hashtbl_intf.Key_poly.t * 'b) list -> ('a, 'b) T.t)
            Core_hashtbl_intf.with_options
          val of_alist_multi :
            (('a Core_hashtbl_intf.Key_poly.t * 'b) list -> ('a, 'b list) T.t)
            Core_hashtbl_intf.with_options
          val create_mapped :
            (get_key:('a -> 'b Core_hashtbl_intf.Key_poly.t) ->
             get_data:('a -> 'c) -> 'a list -> ('b, 'c) T.t)
            Core_hashtbl_intf.with_options
          val create_with_key :
            (get_key:('a -> 'b Core_hashtbl_intf.Key_poly.t) ->
             'a list -> ('b, 'a) T.t)
            Core_hashtbl_intf.with_options
          val group :
            (get_key:('a -> 'b Core_hashtbl_intf.Key_poly.t) ->
             get_data:('a -> 'c) ->
             combine:('c -> 'c -> '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:'c ->
              f:(key:'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 data:'b -> 'c -> 'c) ->
              'c
            val iter :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:(key:'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 data:'b -> unit) ->
              unit
            val existsi :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:(key:'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 data:'b -> bool) ->
              bool
            val exists :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:('b -> 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 ->
              'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t -> bool
            val remove :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t -> unit
            val remove_one :
              ('a, 'b list) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t -> unit
            val replace :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              key:'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
              data:'b -> unit
            val change :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'a 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:'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
              data:'b -> unit
            val map :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:('b -> '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:'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 data:'b -> '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:('b -> '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:'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 data:'b -> '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:('b -> 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:'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 data:'b -> 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 ->
              'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
              default:(unit -> 'b) -> 'b
            val find :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t -> 'b option
            val find_exn :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t -> 'b
            val iter_vals :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:('b -> unit) -> unit
            val merge :
              f:(key:'a 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:'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 'b -> '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 ->
              'a 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:('b -> bool) -> unit
            val filteri_inplace :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:('a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 'b -> bool) ->
              unit
            val equal :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              ('b -> 'b -> bool) -> bool
            val to_alist :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              ('a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t * 'b) list
            val incr :
              ?by:int ->
              ('a, int) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'a 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 :
              (('a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t * 'b) list ->
               [ `Duplicate_key of
                   'a 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 :
              (('a 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 :
              (('a 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:('a -> 'b Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t) ->
               get_data:('a -> 'c) ->
               'a list -> ('b, 'c) Core_hashtbl_intf.Monomorphic(T)(Key).T.t)
              Core_hashtbl_intf.with_options
            val create_with_key :
              (get_key:('a -> 'b 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:('a -> 'b Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t) ->
               get_data:('a -> 'c) ->
               combine:('c -> 'c -> '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 :
              ('a -> 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:'c ->
              f:(key:'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 data:'b -> 'c -> 'c) ->
              'c
            val iter :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:(key:'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 data:'b -> unit) ->
              unit
            val existsi :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:(key:'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 data:'b -> bool) ->
              bool
            val exists :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:('b -> 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 ->
              'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t -> bool
            val remove :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t -> unit
            val remove_one :
              ('a, 'b list) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t -> unit
            val replace :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              key:'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
              data:'b -> unit
            val change :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'a 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:'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
              data:'b -> unit
            val map :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:('b -> '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:'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 data:'b -> '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:('b -> '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:'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 data:'b -> '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:('b -> 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:'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 data:'b -> 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 ->
              'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
              default:(unit -> 'b) -> 'b
            val find :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t -> 'b option
            val find_exn :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t -> 'b
            val iter_vals :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:('b -> unit) -> unit
            val merge :
              f:(key:'a 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:'a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 'b -> '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 ->
              'a 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:('b -> bool) -> unit
            val filteri_inplace :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              f:('a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t ->
                 'b -> bool) ->
              unit
            val equal :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              ('b -> 'b -> bool) -> bool
            val to_alist :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              ('a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t * 'b) list
            val incr :
              ?by:int ->
              ('a, int) Core_hashtbl_intf.Monomorphic(T)(Key).T.t ->
              'a 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 :
              (('a Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t * 'b) list ->
               [ `Duplicate_key of
                   'a 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 :
              (('a 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 :
              (('a 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:('a -> 'b Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t) ->
               get_data:('a -> 'c) ->
               'a list -> ('b, 'c) Core_hashtbl_intf.Monomorphic(T)(Key).T.t)
              Core_hashtbl_intf.with_options
            val create_with_key :
              (get_key:('a -> 'b 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:('a -> 'b Core_hashtbl_intf.Monomorphic(T)(Key).Key1.t) ->
               get_data:('a -> 'c) ->
               combine:('c -> 'c -> '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 :
              ('a -> 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:'c -> f:(key:'a Key1.t -> data:'b -> 'c -> 'c) -> 'c
            val iter :
              ('a, 'b) T.t -> f:(key:'a Key1.t -> data:'b -> unit) -> unit
            val existsi :
              ('a, 'b) T.t -> f:(key:'a Key1.t -> data:'b -> bool) -> bool
            val exists : ('a, 'b) T.t -> f:('b -> bool) -> bool
            val length : ('a, 'b) T.t -> int
            val is_empty : ('a, 'b) T.t -> bool
            val mem : ('a, 'b) T.t -> 'a Key1.t -> bool
            val remove : ('a, 'b) T.t -> 'a Key1.t -> unit
            val remove_one : ('a, 'b list) T.t -> 'a Key1.t -> unit
            val replace : ('a, 'b) T.t -> key:'a Key1.t -> data:'b -> unit
            val change :
              ('a, 'b) T.t -> 'a Key1.t -> ('b option -> 'b option) -> unit
            val add_multi :
              ('a, 'b list) T.t -> key:'a Key1.t -> data:'b -> unit
            val map : ('a, 'b) T.t -> f:('b -> 'c) -> ('a, 'c) T.t
            val mapi :
              ('a, 'b) T.t ->
              f:(key:'a Key1.t -> data:'b -> 'c) -> ('a, 'c) T.t
            val filter_map :
              ('a, 'b) T.t -> f:('b -> 'c option) -> ('a, 'c) T.t
            val filter_mapi :
              ('a, 'b) T.t ->
              f:(key:'a Key1.t -> data:'b -> 'c option) -> ('a, 'c) T.t
            val filter : ('a, 'b) T.t -> f:('b -> bool) -> ('a, 'b) T.t
            val filteri :
              ('a, 'b) T.t ->
              f:(key:'a Key1.t -> data:'b -> bool) -> ('a, 'b) T.t
            val find_or_add :
              ('a, 'b) T.t -> 'a Key1.t -> default:(unit -> 'b) -> 'b
            val find : ('a, 'b) T.t -> 'a Key1.t -> 'b option
            val find_exn : ('a, 'b) T.t -> 'a Key1.t -> 'b
            val iter_vals : ('a, 'b) T.t -> f:('b -> unit) -> unit
            val merge :
              f:(key:'a 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:'a Key1.t -> 'b -> 'b option -> 'b option) ->
              src:('a, 'b) T.t -> dst:('a, 'b) T.t -> unit
            val keys : ('a, 'b) T.t -> 'a Key1.t list
            val data : ('a, 'b) T.t -> 'b list
            val filter_inplace : ('a, 'b) T.t -> f:('b -> bool) -> unit
            val filteri_inplace :
              ('a, 'b) T.t -> f:('a Key1.t -> 'b -> bool) -> unit
            val equal :
              ('a, 'b) T.t -> ('a, 'b) T.t -> ('b -> 'b -> bool) -> bool
            val to_alist : ('a, 'b) T.t -> ('a Key1.t * 'b) list
            val incr : ?by:int -> ('a, int) T.t -> 'a Key1.t -> unit
            val create :
              (unit -> ('a, 'b) T.t) Core_hashtbl_intf.with_options
            val of_alist :
              (('a Key1.t * 'b) list ->
               [ `Duplicate_key of 'a Key1.t | `Ok of ('a, 'b) T.t ])
              Core_hashtbl_intf.with_options
            val of_alist_exn :
              (('a Key1.t * 'b) list -> ('a, 'b) T.t)
              Core_hashtbl_intf.with_options
            val of_alist_multi :
              (('a Key1.t * 'b) list -> ('a, 'b list) T.t)
              Core_hashtbl_intf.with_options
            val create_mapped :
              (get_key:('a -> 'b Key1.t) ->
               get_data:('a -> 'c) -> 'a list -> ('b, 'c) T.t)
              Core_hashtbl_intf.with_options
            val create_with_key :
              (get_key:('a -> 'b Key1.t) -> 'a list -> ('b, 'a) T.t)
              Core_hashtbl_intf.with_options
            val group :
              (get_key:('a -> 'b Key1.t) ->
               get_data:('a -> 'c) ->
               combine:('c -> 'c -> 'c) -> 'a list -> ('b, 'c) T.t)
              Core_hashtbl_intf.with_options
            type 'a sexpable = 'a t
            val sexp_of_t :
              ('a -> 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:('a -> unit) -> unit
          val fold : 'a container -> init:'b -> f:('b -> 'a -> 'b) -> 'b
          val exists : 'a container -> f:('a -> bool) -> bool
          val for_all : 'a container -> f:('a -> bool) -> bool
          val find : 'a container -> f:('a -> 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 -> 'a -> [ `Key_already_present | `Ok ]
          val enqueue_exn : 'a t -> Key.t -> 'a -> 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:('a -> 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 -> 'a -> [ `No_such_key | `Ok ]
          val replace_exn : 'a t -> Key.t -> 'a -> unit
          val iteri : 'a t -> f:(key:Key.t -> data:'a -> unit) -> unit
          val foldi :
            'a t -> init:'b -> f:('b -> key:Key.t -> data:'a -> '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 -> ('a -> 'a -> int) -> 'a t
          val copy : 'a t -> 'a t
          val push :
            'a t -> key:Key.t -> data:'a -> [ `Key_already_present | `Ok ]
          val push_exn : 'a t -> key:Key.t -> data:'a -> unit
          val replace : 'a t -> key:Key.t -> data:'a -> 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:'a -> bool) -> (Key.t * 'a) option
          val cond_pop : 'a t -> ('a -> 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:'a -> unit) -> unit
          val iter_vals : 'a t -> f:('a -> 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:'c ->
              f:(key:'a Table_sig(Hashable).Key1.t -> data:'b -> 'c -> 'c) ->
              'c
            val iter :
              ('a, 'b) Table_sig(Hashable).T.t ->
              f:(key:'a Table_sig(Hashable).Key1.t -> data:'b -> unit) ->
              unit
            val existsi :
              ('a, 'b) Table_sig(Hashable).T.t ->
              f:(key:'a Table_sig(Hashable).Key1.t -> data:'b -> bool) ->
              bool
            val exists :
              ('a, 'b) Table_sig(Hashable).T.t -> f:('b -> 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 ->
              'a Table_sig(Hashable).Key1.t -> bool
            val remove :
              ('a, 'b) Table_sig(Hashable).T.t ->
              'a Table_sig(Hashable).Key1.t -> unit
            val remove_one :
              ('a, 'b list) Table_sig(Hashable).T.t ->
              'a Table_sig(Hashable).Key1.t -> unit
            val replace :
              ('a, 'b) Table_sig(Hashable).T.t ->
              key:'a Table_sig(Hashable).Key1.t -> data:'b -> unit
            val change :
              ('a, 'b) Table_sig(Hashable).T.t ->
              'a Table_sig(Hashable).Key1.t ->
              ('b option -> 'b option) -> unit
            val add_multi :
              ('a, 'b list) Table_sig(Hashable).T.t ->
              key:'a Table_sig(Hashable).Key1.t -> data:'b -> unit
            val map :
              ('a, 'b) Table_sig(Hashable).T.t ->
              f:('b -> 'c) -> ('a, 'c) Table_sig(Hashable).T.t
            val mapi :
              ('a, 'b) Table_sig(Hashable).T.t ->
              f:(key:'a Table_sig(Hashable).Key1.t -> data:'b -> 'c) ->
              ('a, 'c) Table_sig(Hashable).T.t
            val filter_map :
              ('a, 'b) Table_sig(Hashable).T.t ->
              f:('b -> 'c option) -> ('a, 'c) Table_sig(Hashable).T.t
            val filter_mapi :
              ('a, 'b) Table_sig(Hashable).T.t ->
              f:(key:'a Table_sig(Hashable).Key1.t -> data:'b -> 'c option) ->
              ('a, 'c) Table_sig(Hashable).T.t
            val filter :
              ('a, 'b) Table_sig(Hashable).T.t ->
              f:('b -> bool) -> ('a, 'b) Table_sig(Hashable).T.t
            val filteri :
              ('a, 'b) Table_sig(Hashable).T.t ->
              f:(key:'a Table_sig(Hashable).Key1.t -> data:'b -> bool) ->
              ('a, 'b) Table_sig(Hashable).T.t
            val find_or_add :
              ('a, 'b) Table_sig(Hashable).T.t ->
              'a Table_sig(Hashable).Key1.t -> default:(unit -> 'b) -> 'b
            val find :
              ('a, 'b) Table_sig(Hashable).T.t ->
              'a Table_sig(Hashable).Key1.t -> 'b option
            val find_exn :
              ('a, 'b) Table_sig(Hashable).T.t ->
              'a Table_sig(Hashable).Key1.t -> 'b
            val iter_vals :
              ('a, 'b) Table_sig(Hashable).T.t -> f:('b -> unit) -> unit
            val merge :
              f:(key:'a 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:'a Table_sig(Hashable).Key1.t ->
                 'b -> '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 ->
              'a 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:('b -> bool) -> unit
            val filteri_inplace :
              ('a, 'b) Table_sig(Hashable).T.t ->
              f:('a Table_sig(Hashable).Key1.t -> 'b -> bool) -> unit
            val equal :
              ('a, 'b) Table_sig(Hashable).T.t ->
              ('a, 'b) Table_sig(Hashable).T.t -> ('b -> 'b -> bool) -> bool
            val to_alist :
              ('a, 'b) Table_sig(Hashable).T.t ->
              ('a Table_sig(Hashable).Key1.t * 'b) list
            val incr :
              ?by:int ->
              ('a, int) Table_sig(Hashable).T.t ->
              'a Table_sig(Hashable).Key1.t -> unit
            val create :
              (unit -> ('a, 'b) Table_sig(Hashable).T.t)
              Core_hashtbl_intf.with_options
            val of_alist :
              (('a Table_sig(Hashable).Key1.t * 'b) list ->
               [ `Duplicate_key of 'a Table_sig(Hashable).Key1.t
               | `Ok of ('a, 'b) Table_sig(Hashable).T.t ])
              Core_hashtbl_intf.with_options
            val of_alist_exn :
              (('a Table_sig(Hashable).Key1.t * 'b) list ->
               ('a, 'b) Table_sig(Hashable).T.t)
              Core_hashtbl_intf.with_options
            val of_alist_multi :
              (('a 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:('a -> 'b Table_sig(Hashable).Key1.t) ->
               get_data:('a -> 'c) ->
               'a list -> ('b, 'c) Table_sig(Hashable).T.t)
              Core_hashtbl_intf.with_options
            val create_with_key :
              (get_key:('a -> 'b Table_sig(Hashable).Key1.t) ->
               'a list -> ('b, 'a) Table_sig(Hashable).T.t)
              Core_hashtbl_intf.with_options
            val group :
              (get_key:('a -> 'b Table_sig(Hashable).Key1.t) ->
               get_data:('a -> 'c) ->
               combine:('c -> 'c -> 'c) ->
               'a list -> ('b, 'c) Table_sig(Hashable).T.t)
              Core_hashtbl_intf.with_options
            type 'a sexpable = 'a t
            val sexp_of_t :
              ('a -> 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 = 'a 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:('a -> unit) -> unit
            val fold : 'a container -> init:'b -> f:('b -> 'a -> 'b) -> 'b
            val exists : 'a container -> f:('a -> bool) -> bool
            val for_all : 'a container -> f:('a -> bool) -> bool
            val find : 'a container -> f:('a -> 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 -> 'a -> [ `Key_already_present | `Ok ]
            val enqueue_exn : 'a t -> Key.t -> 'a -> 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:('a -> 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 -> 'a -> [ `No_such_key | `Ok ]
            val replace_exn : 'a t -> Key.t -> 'a -> unit
            val iteri : 'a t -> f:(key:Key.t -> data:'a -> unit) -> unit
            val foldi :
              'a t -> init:'b -> f:('b -> key:Key.t -> data:'a -> '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 = 'a Hashable.Make(T).Hash_heap.t
            val create : ?min_size:int -> ('a -> 'a -> int) -> 'a t
            val copy : 'a t -> 'a t
            val push :
              'a t -> key:Key.t -> data:'a -> [ `Key_already_present | `Ok ]
            val push_exn : 'a t -> key:Key.t -> data:'a -> unit
            val replace : 'a t -> key:Key.t -> data:'a -> 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:'a -> bool) -> (Key.t * 'a) option
            val cond_pop : 'a t -> ('a -> 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:'a -> unit) -> unit
            val iter_vals : 'a t -> f:('a -> 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:'c ->
            f:(key:'a Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
               data:'b -> 'c -> '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:'b -> 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:'b -> bool) ->
            bool
          val exists :
            ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
            f:('b -> 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 ->
            'a Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
            bool
          val remove :
            ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
            'a Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
            unit
          val remove_one :
            ('a, 'b list)
            Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
            'a Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
            unit
          val replace :
            ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
            key:'a Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
            data:'b -> unit
          val change :
            ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
            'a 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:'a Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
            data:'b -> unit
          val map :
            ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
            f:('b -> '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:'b -> '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:('b -> '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:'b -> '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:('b -> 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:'b -> 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 ->
            'a Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
            default:(unit -> 'b) -> 'b
          val find :
            ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
            'a Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
            'b option
          val find_exn :
            ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
            'a Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t -> 'b
          val iter_vals :
            ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
            f:('b -> 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 -> '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 ->
            'a 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:('b -> bool) -> unit
          val filteri_inplace :
            ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
            f:('a Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
               'b -> bool) ->
            unit
          val equal :
            ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
            ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
            ('b -> 'b -> bool) -> bool
          val to_alist :
            ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
            ('a Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t * 'b)
            list
          val incr :
            ?by:int ->
            ('a, int) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
            'a 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 :
            (('a Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t * 'b)
             list ->
             [ `Duplicate_key of
                 'a 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 :
            (('a 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 :
            (('a 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:('a ->
                      'b
                      Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t) ->
             get_data:('a -> 'c) ->
             'a list ->
             ('b, 'c) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t)
            Core_hashtbl_intf.with_options
          val create_with_key :
            (get_key:('a ->
                      '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:('a ->
                      'b
                      Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t) ->
             get_data:('a -> 'c) ->
             combine:('c -> 'c -> '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 :
            ('a -> 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:('a -> unit) -> unit
          val fold : 'a container -> init:'b -> f:('b -> 'a -> 'b) -> 'b
          val exists : 'a container -> f:('a -> bool) -> bool
          val for_all : 'a container -> f:('a -> bool) -> bool
          val find : 'a container -> f:('a -> 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 -> 'a -> [ `Key_already_present | `Ok ]
          val enqueue_exn : 'a t -> Key.t -> 'a -> 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:('a -> 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 -> 'a -> [ `No_such_key | `Ok ]
          val replace_exn : 'a t -> Key.t -> 'a -> unit
          val iteri : 'a t -> f:(key:Key.t -> data:'a -> unit) -> unit
          val foldi :
            'a t -> init:'b -> f:('b -> key:Key.t -> data:'a -> '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 -> ('a -> 'a -> int) -> 'a t
          val copy : 'a t -> 'a t
          val push :
            'a t -> key:Key.t -> data:'a -> [ `Key_already_present | `Ok ]
          val push_exn : 'a t -> key:Key.t -> data:'a -> unit
          val replace : 'a t -> key:Key.t -> data:'a -> 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:'a -> bool) -> (Key.t * 'a) option
          val cond_pop : 'a t -> ('a -> 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:'a -> unit) -> unit
          val iter_vals : 'a t -> f:('a -> 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:'c ->
              f:(key:'a
                     Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
                 data:'b -> 'c -> '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:'b -> 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:'b -> bool) ->
              bool
            val exists :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
              f:('b -> 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 ->
              'a Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
              bool
            val remove :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
              'a Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
              unit
            val remove_one :
              ('a, 'b list)
              Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
              'a Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
              unit
            val replace :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
              key:'a Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
              data:'b -> unit
            val change :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
              'a 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:'a Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
              data:'b -> unit
            val map :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
              f:('b -> '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:'b -> '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:('b -> '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:'b -> '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:('b -> 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:'b -> 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 ->
              'a Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
              default:(unit -> 'b) -> 'b
            val find :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
              'a Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
              'b option
            val find_exn :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
              'a Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
              'b
            val iter_vals :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
              f:('b -> 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 -> '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 ->
              'a 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:('b -> bool) -> unit
            val filteri_inplace :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
              f:('a Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t ->
                 'b -> bool) ->
              unit
            val equal :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
              ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
              ('b -> 'b -> bool) -> bool
            val to_alist :
              ('a, 'b) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
              ('a Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t *
               'b)
              list
            val incr :
              ?by:int ->
              ('a, int) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t ->
              'a 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 :
              (('a Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t *
                'b)
               list ->
               [ `Duplicate_key of
                   'a 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 :
              (('a 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 :
              (('a 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:('a ->
                        'b
                        Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t) ->
               get_data:('a -> 'c) ->
               'a list ->
               ('b, 'c) Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).T.t)
              Core_hashtbl_intf.with_options
            val create_with_key :
              (get_key:('a ->
                        '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:('a ->
                        'b
                        Core_hashtbl_intf.Monomorphic(Hashtbl)(Hashable).Key1.t) ->
               get_data:('a -> 'c) ->
               combine:('c -> 'c -> '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 :
              ('a -> 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 = 'a 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:('a -> unit) -> unit
            val fold : 'a container -> init:'b -> f:('b -> 'a -> 'b) -> 'b
            val exists : 'a container -> f:('a -> bool) -> bool
            val for_all : 'a container -> f:('a -> bool) -> bool
            val find : 'a container -> f:('a -> 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 -> 'a -> [ `Key_already_present | `Ok ]
            val enqueue_exn : 'a t -> Key.t -> 'a -> 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:('a -> 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 -> 'a -> [ `No_such_key | `Ok ]
            val replace_exn : 'a t -> Key.t -> 'a -> unit
            val iteri : 'a t -> f:(key:Key.t -> data:'a -> unit) -> unit
            val foldi :
              'a t -> init:'b -> f:('b -> key:Key.t -> data:'a -> '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 = 'a Hashable.Make_binable(T).Hash_heap.t
            val create : ?min_size:int -> ('a -> 'a -> int) -> 'a t
            val copy : 'a t -> 'a t
            val push :
              'a t -> key:Key.t -> data:'a -> [ `Key_already_present | `Ok ]
            val push_exn : 'a t -> key:Key.t -> data:'a -> unit
            val replace : 'a t -> key:Key.t -> data:'a -> 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:'a -> bool) -> (Key.t * 'a) option
            val cond_pop : 'a t -> ('a -> 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:'a -> unit) -> unit
            val iter_vals : 'a t -> f:('a -> unit) -> unit
          end
      end
end