sig
  module Key :
    sig
      type t = t
      val compare : t -> t -> int
      val hash : t -> int
      val t_of_sexp : Sexplib.Sexp.t -> t
      val sexp_of_t : t -> Sexplib.Sexp.t
    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
  val length : 'a t -> int
end