sig
  module type Key =
    sig
      type t
      val hash : Hashtbl2.Key.t -> int
      val sexp_of_t : Hashtbl2.Key.t -> Sexplib.Sexp.t
      val compare : Hashtbl2.Key.t -> Hashtbl2.Key.t -> int
    end
  type ('key1, 'key2, 'data) t
  val invariant :
    'Core_kernel.Invariant_intf.inv ->
    'Core_kernel.Invariant_intf.inv ->
    'Core_kernel.Invariant_intf.inv ->
    ('a, 'b, 'c) t Core_kernel.Invariant_intf.inv
  val clear : ('a, 'b, 'c) Hashtbl2.t -> unit
  val add_exn :
    ('key1, 'key2, 'data) Hashtbl2.t -> 'key1 -> 'key2 -> 'data -> unit
  val set :
    ('key1, 'key2, 'data) Hashtbl2.t -> 'key1 -> 'key2 -> 'data -> unit
  val remove_exn : ('key1, 'key2, 'data) Hashtbl2.t -> 'key1 -> 'key2 -> unit
  val remove_all1 : ('key1, 'key2, 'data) Hashtbl2.t -> 'key1 -> unit
  val find :
    ('key1, 'key2, 'data) Hashtbl2.t -> 'key1 -> 'key2 -> 'data option
  val find1 :
    ('key1, 'key2, 'data) Hashtbl2.t ->
    'key1 -> ('key2, 'data) Core.Std.Hashtbl.t option
  val mem1 : ('key1, 'key2, 'data) Hashtbl2.t -> 'key1 -> bool
  val iter :
    ('key1, 'key2, 'data) Hashtbl2.t ->
    f:('key1 -> 'key2 -> 'data -> unit) -> unit
  val iter_key2 :
    ('key1, 'key2, 'data) Hashtbl2.t ->
    'key1 -> f:('key2 -> 'data -> unit) -> unit
  module Make :
    functor (Key1 : Key) (Key2 : Key->
      sig
        type 'data t = (Key1.t, Key2.t, 'data) t
        val equal : 'Core.Std.Equal.equal -> 'a t Core.Std.Equal.equal
        val create : unit -> 'data Hashtbl2.t
        val sexp_of_t :
          ('data -> Sexplib.Sexp.t) -> 'data Hashtbl2.t -> Sexplib.Sexp.t
      end
  val sexp_of_t :
    ('key1 -> Sexplib.Sexp.t) ->
    ('key2 -> Sexplib.Sexp.t) ->
    ('data -> Sexplib.Sexp.t) ->
    ('key1, 'key2, 'data) Hashtbl2.t -> Sexplib.Sexp.t
end