functor (T : T2->
  functor (Key : T0->
    sig
      module T : sig type ('a, 'b) t = (Core_hashtbl_intf.Key.t, 'b) T.t end
      module Key1 : sig type 'a t = Core_hashtbl_intf.Key.t end
      module type S =
        sig
          module Key : sig type t = Key.t end
          val hashable :
            Core_hashtbl_intf.Monomorphic.S.Key.t Core_hashtbl_intf.hashable
          type 'a t =
              (Core_hashtbl_intf.Monomorphic.S.Key.t, 'a)
              Core_hashtbl_intf.Monomorphic.T.t
          val clear : ('a, 'b) T.t -> unit
          val copy : ('a, 'b) T.t -> ('a, 'b) T.t
          val invariant : ('a, 'b) T.t -> unit
          val fold :
            ('a, 'b) T.t ->
            init:'-> f:(key:'Key1.t -> data:'-> '-> 'c) -> 'c
          val iter :
            ('a, 'b) T.t -> f:(key:'Key1.t -> data:'-> unit) -> unit
          val existsi :
            ('a, 'b) T.t -> f:(key:'Key1.t -> data:'-> bool) -> bool
          val exists : ('a, 'b) T.t -> f:('-> bool) -> bool
          val length : ('a, 'b) T.t -> int
          val is_empty : ('a, 'b) T.t -> bool
          val mem : ('a, 'b) T.t -> 'Key1.t -> bool
          val remove : ('a, 'b) T.t -> 'Key1.t -> unit
          val remove_one : ('a, 'b list) T.t -> 'Key1.t -> unit
          val replace : ('a, 'b) T.t -> key:'Key1.t -> data:'-> unit
          val change :
            ('a, 'b) T.t -> 'Key1.t -> ('b option -> 'b option) -> unit
          val add_multi :
            ('a, 'b list) T.t -> key:'Key1.t -> data:'-> unit
          val map : ('a, 'b) T.t -> f:('-> 'c) -> ('a, 'c) T.t
          val mapi :
            ('a, 'b) T.t ->
            f:(key:'Key1.t -> data:'-> 'c) -> ('a, 'c) T.t
          val filter_map :
            ('a, 'b) T.t -> f:('-> 'c option) -> ('a, 'c) T.t
          val filter_mapi :
            ('a, 'b) T.t ->
            f:(key:'Key1.t -> data:'-> 'c option) -> ('a, 'c) T.t
          val filter : ('a, 'b) T.t -> f:('-> bool) -> ('a, 'b) T.t
          val filteri :
            ('a, 'b) T.t ->
            f:(key:'Key1.t -> data:'-> bool) -> ('a, 'b) T.t
          val find_or_add :
            ('a, 'b) T.t -> 'Key1.t -> default:(unit -> 'b) -> 'b
          val find : ('a, 'b) T.t -> 'Key1.t -> 'b option
          val find_exn : ('a, 'b) T.t -> 'Key1.t -> 'b
          val iter_vals : ('a, 'b) T.t -> f:('-> unit) -> unit
          val merge :
            f:(key:'Key1.t -> 'b option -> 'c option -> 'd option) ->
            ('a, 'b) T.t -> ('a, 'c) T.t -> ('a, 'd) T.t
          val merge_into :
            f:(key:'Key1.t -> '-> 'b option -> 'b option) ->
            src:('a, 'b) T.t -> dst:('a, 'b) T.t -> unit
          val keys : ('a, 'b) T.t -> 'Key1.t list
          val data : ('a, 'b) T.t -> 'b list
          val filter_inplace : ('a, 'b) T.t -> f:('-> bool) -> unit
          val filteri_inplace :
            ('a, 'b) T.t -> f:('Key1.t -> '-> bool) -> unit
          val equal :
            ('a, 'b) T.t -> ('a, 'b) T.t -> ('-> '-> bool) -> bool
          val to_alist : ('a, 'b) T.t -> ('Key1.t * 'b) list
          val incr : ?by:int -> ('a, int) T.t -> 'Key1.t -> unit
          val create : (unit -> ('a, 'b) T.t) with_options
          val of_alist :
            (('Key1.t * 'b) list ->
             [ `Duplicate_key of 'Key1.t | `Ok of ('a, 'b) T.t ])
            with_options
          val of_alist_exn :
            (('Key1.t * 'b) list -> ('a, 'b) T.t) with_options
          val of_alist_multi :
            (('Key1.t * 'b) list -> ('a, 'b list) T.t) with_options
          val create_mapped :
            (get_key:('-> 'Key1.t) ->
             get_data:('-> 'c) -> 'a list -> ('b, 'c) T.t)
            with_options
          val create_with_key :
            (get_key:('-> 'Key1.t) -> 'a list -> ('b, 'a) T.t)
            with_options
          val group :
            (get_key:('-> 'Key1.t) ->
             get_data:('-> 'c) ->
             combine:('-> '-> 'c) -> 'a list -> ('b, 'c) T.t)
            with_options
          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
        end
    end