def join[A, B, C, D, E]()

in src/main/scala/com/twitter/stitch/Arrow.scala [2730:2766]


  def join[A, B, C, D, E](
    a1: Arrow[A, B],
    a2: Arrow[A, C],
    a3: Arrow[A, D],
    a4: Arrow[A, E]
  ): Arrow[A, (B, C, D, E)] =
    joinMap(a1, a2, a3, a4)((_, _, _, _))

  /**
   * `Arrow.joinMap(a1, a2, a3, a4)(k)` is equivalent to
   * `Arrow.join(a1, a2, a3, a4).map(k.tupled)`,
   * but avoids allocating an intermediate tuple.
   */
  def joinMap[A, B, C, D, E, Z](
    a1: Arrow[A, B],
    a2: Arrow[A, C],
    a3: Arrow[A, D],
    a4: Arrow[A, E]
  )(
    k: (B, C, D, E) => Z
  ): Arrow[A, Z] =
    (a1, a2, a3, a4) match {
      case (Const(Throw(e)), _, _, _) => exception(e)
      case (_, Const(Throw(e)), _, _) => exception(e)
      case (_, _, Const(Throw(e)), _) => exception(e)
      case (_, _, _, Const(Throw(e))) => exception(e)
      case (Const(Return(v1)), _, _, _) =>
        joinMap(a2, a3, a4) { (v2, v3, v4) => k(v1, v2, v3, v4) }
      case (_, Const(Return(v2)), _, _) =>
        joinMap(a1, a3, a4) { (v1, v3, v4) => k(v1, v2, v3, v4) }
      case (_, _, Const(Return(v3)), _) =>
        joinMap(a1, a2, a4) { (v1, v2, v4) => k(v1, v2, v3, v4) }
      case (_, _, _, Const(Return(v4))) =>
        joinMap(a1, a2, a3) { (v1, v2, v3) => k(v1, v2, v3, v4) }
      case _ =>
        JoinMap4(a1, a2, a3, a4, k)
    }