functor (P : Param->
  sig
    module HashX :
      sig
        type key = P.HashX.key
        type 'a t = (key, 'a) Hashhe.hashtbl
        module Hash :
          sig type t = key val equal : t -> t -> bool val hash : t -> int end
        val create : int -> 'a t
        val clear : 'a t -> unit
        val copy : 'a t -> 'a t
        val add : 'a t -> key -> '-> unit
        val remove : 'a t -> key -> unit
        val find : 'a t -> key -> 'a
        val find_all : 'a t -> key -> 'a list
        val replace : 'a t -> key -> '-> unit
        val mem : 'a t -> key -> bool
        val iter : (key -> '-> unit) -> 'a t -> unit
        val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
        val map : (key -> '-> 'b) -> 'a t -> 'b t
        val length : 'a t -> int
        val print :
          ?first:(unit, Format.formatter, unit) format ->
          ?sep:(unit, Format.formatter, unit) format ->
          ?last:(unit, Format.formatter, unit) format ->
          ?firstbind:(unit, Format.formatter, unit) format ->
          ?sepbind:(unit, Format.formatter, unit) format ->
          ?lastbind:(unit, Format.formatter, unit) format ->
          (Format.formatter -> key -> unit) ->
          (Format.formatter -> '-> unit) ->
          Format.formatter -> 'a t -> unit
      end
    module HashY :
      sig
        type key = P.HashY.key
        type 'a t = (key, 'a) Hashhe.hashtbl
        module Hash :
          sig type t = key val equal : t -> t -> bool val hash : t -> int end
        val create : int -> 'a t
        val clear : 'a t -> unit
        val copy : 'a t -> 'a t
        val add : 'a t -> key -> '-> unit
        val remove : 'a t -> key -> unit
        val find : 'a t -> key -> 'a
        val find_all : 'a t -> key -> 'a list
        val replace : 'a t -> key -> '-> unit
        val mem : 'a t -> key -> bool
        val iter : (key -> '-> unit) -> 'a t -> unit
        val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
        val map : (key -> '-> 'b) -> 'a t -> 'b t
        val length : 'a t -> int
        val print :
          ?first:(unit, Format.formatter, unit) format ->
          ?sep:(unit, Format.formatter, unit) format ->
          ?last:(unit, Format.formatter, unit) format ->
          ?firstbind:(unit, Format.formatter, unit) format ->
          ?sepbind:(unit, Format.formatter, unit) format ->
          ?lastbind:(unit, Format.formatter, unit) format ->
          (Format.formatter -> key -> unit) ->
          (Format.formatter -> '-> unit) ->
          Format.formatter -> 'a t -> unit
      end
    type x = HashX.key
    type y = HashY.key
    type t
    val hashx : t -> y HashX.t
    val hashy : t -> x HashY.t
    val clear : t -> unit
    val create : int -> t
    val add : t -> x -> y -> unit
    val y_of_x : t -> x -> y
    val x_of_y : t -> y -> x
    val removex : t -> x -> unit
    val removey : t -> y -> unit
    val memx : t -> x -> bool
    val memy : t -> y -> bool
    val iter : t -> (x -> y -> unit) -> unit
    val fold : t -> '-> (x -> y -> '-> 'a) -> 'a
    val cardinal : t -> int
    val print :
      ?first:(unit, Format.formatter, unit) format ->
      ?sep:(unit, Format.formatter, unit) format ->
      ?last:(unit, Format.formatter, unit) format ->
      ?firstbind:(unit, Format.formatter, unit) format ->
      ?sepbind:(unit, Format.formatter, unit) format ->
      ?lastbind:(unit, Format.formatter, unit) format ->
      (Format.formatter -> x -> unit) ->
      (Format.formatter -> y -> unit) -> Format.formatter -> t -> unit
  end