sig
  type ('a, 'b) t = 'a * 'b
  val make : '-> '-> 'a * 'b
  val fst : 'a * '-> 'a
  val snd : 'a * '-> 'b
  val swap : 'a * '-> 'b * 'a
  val fold : ('-> '-> 'c) -> 'a * '-> 'c
  val map : ('-> 'c) -> ('-> 'd) -> 'a * '-> 'c * 'd
  val iter : ('-> unit) -> ('-> unit) -> 'a * '-> unit
  val map_fst : ('-> 'c) -> 'a * '-> 'c * 'b
  val map_snd : ('-> 'c) -> 'a * '-> 'a * 'c
  val equal :
    ('-> '-> bool) -> ('-> '-> bool) -> 'a * '-> 'a * '-> bool
  val compare :
    ('-> '-> int) -> ('-> '-> int) -> 'a * '-> 'a * '-> int
end