sig
  type ('a, 'b) t = 'a * 'b
  val make : 'a -> 'b -> ('a, 'b) CCPair.t
  val map1 : ('a -> 'b) -> 'a * 'c -> 'b * 'c
  val map2 : ('a -> 'b) -> 'c * 'a -> 'c * 'b
  val map : ('a -> 'c) -> ('b -> 'd) -> 'a * 'b -> 'c * 'd
  val map_same : ('a -> 'b) -> 'a * 'a -> 'b * 'b
  val map_fst : ('a -> 'b) -> 'a * 'c -> 'b
  val map_snd : ('a -> 'b) -> 'c * 'a -> 'b
  val iter : ('a -> 'b -> unit) -> 'a * 'b -> unit
  val swap : 'a * 'b -> 'b * 'a
  val ( <<< ) : ('a -> 'b) -> 'a * 'c -> 'b * 'c
  val ( >>> ) : ('a -> 'b) -> 'c * 'a -> 'c * 'b
  val ( *** ) : ('a -> 'c) -> ('b -> 'd) -> 'a * 'b -> 'c * 'd
  val ( &&& ) : ('a -> 'b) -> ('a -> 'c) -> 'a -> 'b * 'c
  val merge : ('a -> 'b -> 'c) -> 'a * 'b -> 'c
  val fold : ('a -> 'b -> 'c) -> 'a * 'b -> 'c
  val dup : 'a -> 'a * 'a
  val dup_map : ('a -> 'b) -> 'a -> 'a * 'b
  val equal :
    ('a -> 'a -> bool) -> ('b -> 'b -> bool) -> 'a * 'b -> 'a * 'b -> bool
  val compare :
    ('a -> 'a -> int) -> ('b -> 'b -> int) -> 'a * 'b -> 'a * 'b -> int
  type 'a printer = Format.formatter -> 'a -> unit
  val pp :
    ?sep:string ->
    'a CCPair.printer -> 'b CCPair.printer -> ('a * 'b) CCPair.printer
end