functor (Key : Key->
  sig
    module Key :
      sig
        type t = Key.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