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