sig
  val mk : 'a -> 'b -> 'a * 'b
  val left : 'a * 'b -> 'a
  val right : 'a * 'b -> 'b
  val map : ('a -> 'b) -> 'a * 'a -> 'b * 'b
  val map_left : ('a -> 'c) -> 'a * 'b -> 'c * 'b
  val map_right : ('b -> 'c) -> 'a * 'b -> 'a * 'c
  val apply : ('a -> 'b -> 'c) -> 'a * 'b -> 'c
  val conj : bool * bool -> bool
  val disj : bool * bool -> bool
  val swap : 'a * 'b -> 'b * 'a
  val fold : ('a -> 'b -> 'b) -> 'a * 'a -> 'b -> 'b
  val both : bool * bool -> bool
  val either : bool * bool -> bool
  module Make :
    functor (T : Utilsigs.BasicType) (S : Utilsigs.BasicType) ->
      sig
        type t = T.t * S.t
        val compare : t -> t -> int
        val equal : t -> t -> bool
        val hash : t -> int
        val to_string : t -> string
        val pp : Format.formatter -> t -> unit
      end
end