sig
  module type Key = Hashtbl.HashedType
  module type S =
    sig
      module Key : Key
      type 'a t
      val create : ?min_size:int -> ('-> '-> int) -> 'a t
      val copy : 'a t -> 'a t
      val push :
        'a t -> key:Key.t -> data:'-> [ `Key_already_present | `Ok ]
      val push_exn : 'a t -> key:Key.t -> data:'-> unit
      val replace : 'a t -> key:Key.t -> data:'-> unit
      val remove : 'a t -> Key.t -> unit
      val mem : 'a t -> Key.t -> bool
      val top : 'a t -> 'a option
      val top_exn : 'a t -> 'a
      val top_with_key : 'a t -> (Key.t * 'a) option
      val top_with_key_exn : 'a t -> Key.t * 'a
      val pop_with_key : 'a t -> (Key.t * 'a) option
      val pop_with_key_exn : 'a t -> Key.t * 'a
      val pop : 'a t -> 'a option
      val pop_exn : 'a t -> 'a
      val cond_pop_with_key :
        'a t -> (key:Key.t -> data:'-> bool) -> (Key.t * 'a) option
      val cond_pop : 'a t -> ('-> bool) -> 'a option
      val find : 'a t -> Key.t -> 'a option
      val find_pop : 'a t -> Key.t -> 'a option
      val find_exn : 'a t -> Key.t -> 'a
      val find_pop_exn : 'a t -> Key.t -> 'a
      val iter : 'a t -> f:(key:Key.t -> data:'-> unit) -> unit
      val iter_vals : 'a t -> f:('-> unit) -> unit
    end
  module Make :
    functor (Key : Key->
      sig
        module Key :
          sig
            type t = Key.t
            val equal : t -> t -> bool
            val hash : t -> int
            type sexpable = t
            val sexp_of_t : sexpable -> Sexplib.Sexp.t
            val t_of_sexp : Sexplib.Sexp.t -> sexpable
          end
        type 'a t = 'Hash_heap.Make(Key).t
        val create : ?min_size:int -> ('-> '-> int) -> 'a t
        val copy : 'a t -> 'a t
        val push :
          'a t -> key:Key.t -> data:'-> [ `Key_already_present | `Ok ]
        val push_exn : 'a t -> key:Key.t -> data:'-> unit
        val replace : 'a t -> key:Key.t -> data:'-> unit
        val remove : 'a t -> Key.t -> unit
        val mem : 'a t -> Key.t -> bool
        val top : 'a t -> 'a option
        val top_exn : 'a t -> 'a
        val top_with_key : 'a t -> (Key.t * 'a) option
        val top_with_key_exn : 'a t -> Key.t * 'a
        val pop_with_key : 'a t -> (Key.t * 'a) option
        val pop_with_key_exn : 'a t -> Key.t * 'a
        val pop : 'a t -> 'a option
        val pop_exn : 'a t -> 'a
        val cond_pop_with_key :
          'a t -> (key:Key.t -> data:'-> bool) -> (Key.t * 'a) option
        val cond_pop : 'a t -> ('-> bool) -> 'a option
        val find : 'a t -> Key.t -> 'a option
        val find_pop : 'a t -> Key.t -> 'a option
        val find_exn : 'a t -> Key.t -> 'a
        val find_pop_exn : 'a t -> Key.t -> 'a
        val iter : 'a t -> f:(key:Key.t -> data:'-> unit) -> unit
        val iter_vals : 'a t -> f:('-> unit) -> unit
      end
end