in src/main/scala/com/twitter/stitch/Arrow.scala [2673:2691]
def join[A, B, C](a1: Arrow[A, B], a2: Arrow[A, C]): Arrow[A, (B, C)] =
joinMap(a1, a2)((_, _))
/**
* `Arrow.joinMap(a1, a2)(k)` is equivalent to
* `Arrow.join(a1, a2).map(k.tupled)`,
* but avoids allocating an intermediate tuple.
*/
def joinMap[A, B, C, Z](a1: Arrow[A, B], a2: Arrow[A, C])(k: (B, C) => Z): Arrow[A, Z] =
(a1, a2) match {
case (Const(Throw(e)), _) => exception(e)
case (_, Const(Throw(e))) => exception(e)
case (Const(Return(v1)), _) =>
a2.map(v2 => k(v1, v2))
case (_, Const(Return(v2))) =>
a1.map(v1 => k(v1, v2))
case _ =>
JoinMap2(a1, a2, k)
}