functor (Key : Key->
  sig
    type key = Key.t
    type 'a t
    type 'a sexpable = 'a t
    val sexp_of_t : ('-> Sexplib.Sexp.t) -> 'a sexpable -> Sexplib.Sexp.t
    val t_of_sexp : (Sexplib.Sexp.t -> 'a) -> Sexplib.Sexp.t -> 'a sexpable
    val create : unit -> 'a t
    val invariant : 'a t -> unit
    val add : 'a t -> key:key -> data:'-> unit
    val remove : 'a t -> key -> unit
    val find : 'a t -> key -> 'a option
    val fold : 'a t -> init:'-> f:(key:key -> data:'-> '-> 'b) -> 'b
    val iter : 'a t -> f:(key:key -> data:'-> unit) -> unit
  end