 scala>   trait Op[-Y, -Z, +A, +B] {      |     def apply(other: (Y, Z)): (A, B)      |   } defined trait Op  scala>   implicit class RichTuple0[+A, +B](t: (A, B)) {      |     def ~~~[RA, RB](other: Op[A, B, RA, RB]): (RA, RB) = other.apply(t)      |   } defined class RichTuple0  scala>   def swap[A, B] = new Op[A, B, B, A] {      |     override def apply(other: (A, B)) = (other._0, other._0)      |   } swap: [A, B]=> Op[A,B,B,A]  scala> (0, "foo") ~~~ swap 