sig
  type ('a, 'b) t = { xy : ('a, 'b) Hashhe.t; yx : ('b, 'a) Hashhe.t; }
  val hashx : ('a, 'b) DHashhe.t -> ('a, 'b) Hashhe.t
  val hashy : ('a, 'b) DHashhe.t -> ('b, 'a) Hashhe.t
  val clear : ('a, 'b) DHashhe.t -> unit
  val create : int -> ('a, 'b) DHashhe.t
  val add : ('a, 'b) DHashhe.t -> '-> '-> unit
  val y_of_x : ('a, 'b) DHashhe.t -> '-> 'b
  val x_of_y : ('a, 'b) DHashhe.t -> '-> 'a
  val removex : ('a, 'b) DHashhe.t -> '-> unit
  val removey : ('a, 'b) DHashhe.t -> '-> unit
  val memx : ('a, 'b) DHashhe.t -> '-> bool
  val memy : ('a, 'b) DHashhe.t -> '-> bool
  val iter : ('a, 'b) DHashhe.t -> ('-> '-> unit) -> unit
  val fold : ('a, 'b) DHashhe.t -> '-> ('-> '-> '-> 'c) -> 'c
  val cardinal : ('a, 'b) DHashhe.t -> int
  val print :
    ?first:(unit, Format.formatter, unit) Pervasives.format ->
    ?sep:(unit, Format.formatter, unit) Pervasives.format ->
    ?last:(unit, Format.formatter, unit) Pervasives.format ->
    ?firstbind:(unit, Format.formatter, unit) Pervasives.format ->
    ?sepbind:(unit, Format.formatter, unit) Pervasives.format ->
    ?lastbind:(unit, Format.formatter, unit) Pervasives.format ->
    (Format.formatter -> '-> unit) ->
    (Format.formatter -> '-> unit) ->
    Format.formatter -> ('a, 'b) DHashhe.t -> unit
  module type Param = sig module HashX : Hashhe.S module HashY : Hashhe.S end
  module type S =
    sig
      module HashX : Hashhe.S
      module HashY : Hashhe.S
      type x = HashX.key
      type y = HashY.key
      type t
      val hashx : DHashhe.S.t -> DHashhe.S.y HashX.t
      val hashy : DHashhe.S.t -> DHashhe.S.x HashY.t
      val clear : DHashhe.S.t -> unit
      val create : int -> DHashhe.S.t
      val add : DHashhe.S.t -> DHashhe.S.x -> DHashhe.S.y -> unit
      val y_of_x : DHashhe.S.t -> DHashhe.S.x -> DHashhe.S.y
      val x_of_y : DHashhe.S.t -> DHashhe.S.y -> DHashhe.S.x
      val removex : DHashhe.S.t -> DHashhe.S.x -> unit
      val removey : DHashhe.S.t -> DHashhe.S.y -> unit
      val memx : DHashhe.S.t -> DHashhe.S.x -> bool
      val memy : DHashhe.S.t -> DHashhe.S.y -> bool
      val iter : DHashhe.S.t -> (DHashhe.S.x -> DHashhe.S.y -> unit) -> unit
      val fold :
        DHashhe.S.t -> '-> (DHashhe.S.x -> DHashhe.S.y -> '-> 'a) -> 'a
      val cardinal : DHashhe.S.t -> int
      val print :
        ?first:(unit, Format.formatter, unit) Pervasives.format ->
        ?sep:(unit, Format.formatter, unit) Pervasives.format ->
        ?last:(unit, Format.formatter, unit) Pervasives.format ->
        ?firstbind:(unit, Format.formatter, unit) Pervasives.format ->
        ?sepbind:(unit, Format.formatter, unit) Pervasives.format ->
        ?lastbind:(unit, Format.formatter, unit) Pervasives.format ->
        (Format.formatter -> DHashhe.S.x -> unit) ->
        (Format.formatter -> DHashhe.S.y -> unit) ->
        Format.formatter -> DHashhe.S.t -> unit
    end
  module Make :
    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
end