All Downloads are FREE. Search and download functionalities are using the official Maven repository.

decrel.Zippable.scala Maven / Gradle / Ivy

/*
 * Copyright (c) 2022 Haemin Yoo
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */

/*
 * This file incorporates work covered by the following copyright and
 * permission notice:
 *
 *   Copyright 2017-2022 John A. De Goes and the ZIO Contributors
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 */

// This file is based on https://github.com/zio/zio/blob/v2.0.2/core/shared/src/main/scala/zio/Zippable.scala
// And subsequently modified to add ZippableLowPriority2, adding support for prepending to tuples.

package decrel

trait Zippable[-A, -B] {
  type Out
  def zip(left: A, right: B): Out
}

object Zippable extends ZippableLowPriority1 {

  type Out[-A, -B, C] = Zippable[A, B] { type Out = C }

  implicit def ZippableLeftIdentity[A]: Zippable.Out[Unit, A, A] =
    new Zippable[Unit, A] {
      type Out = A
      def zip(left: Unit, right: A) =
        right
    }
}

trait ZippableLowPriority1 extends ZippableLowPriority2 {

  implicit def ZippableRightIdentity[A]: Zippable.Out[A, Unit, A] =
    new Zippable[A, Unit] {
      type Out = A
      def zip(left: A, right: Unit) =
        left
    }
}

trait ZippableLowPriority2 extends ZippableLowPriority3 {

  implicit def Zippable3Prepend[Z, A, B]: Zippable.Out[Z, (A, B), (Z, A, B)] =
    new Zippable[Z, (A, B)] {
      type Out = (Z, A, B)
      def zip(left: Z, right: (A, B)): (Z, A, B) =
        (left, right._1, right._2)
    }

  implicit def Zippable4Prepend[Z, A, B, C]: Zippable.Out[Z, (A, B, C), (Z, A, B, C)] =
    new Zippable[Z, (A, B, C)] {
      type Out = (Z, A, B, C)
      def zip(left: Z, right: (A, B, C)): (Z, A, B, C) =
        (left, right._1, right._2, right._3)
    }

  implicit def Zippable5Prepend[Z, A, B, C, D]: Zippable.Out[Z, (A, B, C, D), (Z, A, B, C, D)] =
    new Zippable[Z, (A, B, C, D)] {
      type Out = (Z, A, B, C, D)
      def zip(left: Z, right: (A, B, C, D)): (Z, A, B, C, D) =
        (left, right._1, right._2, right._3, right._4)
    }

  implicit def Zippable6Prepend[Z, A, B, C, D, E]
    : Zippable.Out[Z, (A, B, C, D, E), (Z, A, B, C, D, E)] =
    new Zippable[Z, (A, B, C, D, E)] {
      type Out = (Z, A, B, C, D, E)
      def zip(left: Z, right: (A, B, C, D, E)): (Z, A, B, C, D, E) =
        (left, right._1, right._2, right._3, right._4, right._5)
    }

  implicit def Zippable7Prepend[Z, A, B, C, D, E, F]
    : Zippable.Out[Z, (A, B, C, D, E, F), (Z, A, B, C, D, E, F)] =
    new Zippable[Z, (A, B, C, D, E, F)] {
      type Out = (Z, A, B, C, D, E, F)
      def zip(left: Z, right: (A, B, C, D, E, F)): (Z, A, B, C, D, E, F) =
        (left, right._1, right._2, right._3, right._4, right._5, right._6)
    }

  implicit def Zippable8Prepend[Z, A, B, C, D, E, F, G]
    : Zippable.Out[Z, (A, B, C, D, E, F, G), (Z, A, B, C, D, E, F, G)] =
    new Zippable[Z, (A, B, C, D, E, F, G)] {
      type Out = (Z, A, B, C, D, E, F, G)
      def zip(left: Z, right: (A, B, C, D, E, F, G)): (Z, A, B, C, D, E, F, G) =
        (left, right._1, right._2, right._3, right._4, right._5, right._6, right._7)
    }

  implicit def Zippable9Prepend[Z, A, B, C, D, E, F, G, H]
    : Zippable.Out[Z, (A, B, C, D, E, F, G, H), (Z, A, B, C, D, E, F, G, H)] =
    new Zippable[Z, (A, B, C, D, E, F, G, H)] {
      type Out = (Z, A, B, C, D, E, F, G, H)
      def zip(left: Z, right: (A, B, C, D, E, F, G, H)): (Z, A, B, C, D, E, F, G, H) =
        (left, right._1, right._2, right._3, right._4, right._5, right._6, right._7, right._8)
    }

  implicit def Zippable10Prepend[Z, A, B, C, D, E, F, G, H, I]
    : Zippable.Out[Z, (A, B, C, D, E, F, G, H, I), (Z, A, B, C, D, E, F, G, H, I)] =
    new Zippable[Z, (A, B, C, D, E, F, G, H, I)] {
      type Out = (Z, A, B, C, D, E, F, G, H, I)
      def zip(left: Z, right: (A, B, C, D, E, F, G, H, I)): (Z, A, B, C, D, E, F, G, H, I) =
        (
          left,
          right._1,
          right._2,
          right._3,
          right._4,
          right._5,
          right._6,
          right._7,
          right._8,
          right._9
        )
    }

  implicit def Zippable11Prepend[Z, A, B, C, D, E, F, G, H, I, J]
    : Zippable.Out[Z, (A, B, C, D, E, F, G, H, I, J), (Z, A, B, C, D, E, F, G, H, I, J)] =
    new Zippable[Z, (A, B, C, D, E, F, G, H, I, J)] {
      type Out = (Z, A, B, C, D, E, F, G, H, I, J)
      def zip(left: Z, right: (A, B, C, D, E, F, G, H, I, J)): (Z, A, B, C, D, E, F, G, H, I, J) =
        (
          left,
          right._1,
          right._2,
          right._3,
          right._4,
          right._5,
          right._6,
          right._7,
          right._8,
          right._9,
          right._10
        )
    }

  implicit def Zippable12Prepend[Z, A, B, C, D, E, F, G, H, I, J, K]
    : Zippable.Out[Z, (A, B, C, D, E, F, G, H, I, J, K), (Z, A, B, C, D, E, F, G, H, I, J, K)] =
    new Zippable[Z, (A, B, C, D, E, F, G, H, I, J, K)] {
      type Out = (Z, A, B, C, D, E, F, G, H, I, J, K)
      def zip(
        left: Z,
        right: (A, B, C, D, E, F, G, H, I, J, K)
      ): (Z, A, B, C, D, E, F, G, H, I, J, K) =
        (
          left,
          right._1,
          right._2,
          right._3,
          right._4,
          right._5,
          right._6,
          right._7,
          right._8,
          right._9,
          right._10,
          right._11
        )
    }

  implicit def Zippable13Prepend[Z, A, B, C, D, E, F, G, H, I, J, K, L]: Zippable.Out[
    Z,
    (A, B, C, D, E, F, G, H, I, J, K, L),
    (Z, A, B, C, D, E, F, G, H, I, J, K, L)
  ] =
    new Zippable[Z, (A, B, C, D, E, F, G, H, I, J, K, L)] {
      type Out = (Z, A, B, C, D, E, F, G, H, I, J, K, L)
      def zip(
        left: Z,
        right: (A, B, C, D, E, F, G, H, I, J, K, L)
      ): (Z, A, B, C, D, E, F, G, H, I, J, K, L) =
        (
          left,
          right._1,
          right._2,
          right._3,
          right._4,
          right._5,
          right._6,
          right._7,
          right._8,
          right._9,
          right._10,
          right._11,
          right._12
        )
    }

  implicit def Zippable14Prepend[Z, A, B, C, D, E, F, G, H, I, J, K, L, M]: Zippable.Out[
    Z,
    (A, B, C, D, E, F, G, H, I, J, K, L, M),
    (Z, A, B, C, D, E, F, G, H, I, J, K, L, M)
  ] =
    new Zippable[Z, (A, B, C, D, E, F, G, H, I, J, K, L, M)] {
      type Out = (Z, A, B, C, D, E, F, G, H, I, J, K, L, M)
      def zip(
        left: Z,
        right: (A, B, C, D, E, F, G, H, I, J, K, L, M)
      ): (Z, A, B, C, D, E, F, G, H, I, J, K, L, M) =
        (
          left,
          right._1,
          right._2,
          right._3,
          right._4,
          right._5,
          right._6,
          right._7,
          right._8,
          right._9,
          right._10,
          right._11,
          right._12,
          right._13
        )
    }

  implicit def Zippable15Prepend[Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N]: Zippable.Out[
    Z,
    (A, B, C, D, E, F, G, H, I, J, K, L, M, N),
    (Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N)
  ] =
    new Zippable[Z, (A, B, C, D, E, F, G, H, I, J, K, L, M, N)] {
      type Out = (Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N)
      def zip(
        left: Z,
        right: (A, B, C, D, E, F, G, H, I, J, K, L, M, N)
      ): (Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N) =
        (
          left,
          right._1,
          right._2,
          right._3,
          right._4,
          right._5,
          right._6,
          right._7,
          right._8,
          right._9,
          right._10,
          right._11,
          right._12,
          right._13,
          right._14
        )
    }

  implicit def Zippable16Prepend[Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O]: Zippable.Out[
    Z,
    (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O),
    (Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O)
  ] =
    new Zippable[Z, (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O)] {
      type Out = (Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O)
      def zip(
        left: Z,
        right: (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O)
      ): (Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O) =
        (
          left,
          right._1,
          right._2,
          right._3,
          right._4,
          right._5,
          right._6,
          right._7,
          right._8,
          right._9,
          right._10,
          right._11,
          right._12,
          right._13,
          right._14,
          right._15
        )
    }

  implicit def Zippable17Prepend[Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P]: Zippable.Out[
    Z,
    (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P),
    (Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P)
  ] =
    new Zippable[Z, (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P)] {
      type Out = (Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P)
      def zip(
        left: Z,
        right: (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P)
      ): (Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P) =
        (
          left,
          right._1,
          right._2,
          right._3,
          right._4,
          right._5,
          right._6,
          right._7,
          right._8,
          right._9,
          right._10,
          right._11,
          right._12,
          right._13,
          right._14,
          right._15,
          right._16
        )
    }

  implicit def Zippable18Prepend[Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q]
    : Zippable.Out[
      Z,
      (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q),
      (Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q)
    ] =
    new Zippable[Z, (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q)] {
      type Out = (Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q)
      def zip(
        left: Z,
        right: (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q)
      ): (Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q) =
        (
          left,
          right._1,
          right._2,
          right._3,
          right._4,
          right._5,
          right._6,
          right._7,
          right._8,
          right._9,
          right._10,
          right._11,
          right._12,
          right._13,
          right._14,
          right._15,
          right._16,
          right._17
        )
    }

  implicit def Zippable19Prepend[Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R]
    : Zippable.Out[
      Z,
      (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R),
      (Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R)
    ] =
    new Zippable[Z, (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R)] {
      type Out = (Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R)
      def zip(
        left: Z,
        right: (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R)
      ): (Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R) =
        (
          left,
          right._1,
          right._2,
          right._3,
          right._4,
          right._5,
          right._6,
          right._7,
          right._8,
          right._9,
          right._10,
          right._11,
          right._12,
          right._13,
          right._14,
          right._15,
          right._16,
          right._17,
          right._18
        )
    }

  implicit def Zippable20Prepend[Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S]
    : Zippable.Out[
      Z,
      (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S),
      (Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S)
    ] =
    new Zippable[Z, (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S)] {
      type Out = (Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S)
      def zip(
        left: Z,
        right: (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S)
      ): (Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S) =
        (
          left,
          right._1,
          right._2,
          right._3,
          right._4,
          right._5,
          right._6,
          right._7,
          right._8,
          right._9,
          right._10,
          right._11,
          right._12,
          right._13,
          right._14,
          right._15,
          right._16,
          right._17,
          right._18,
          right._19
        )
    }

  implicit def Zippable21Prepend[Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T]
    : Zippable.Out[
      Z,
      (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T),
      (Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T)
    ] =
    new Zippable[Z, (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T)] {
      type Out = (Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T)
      def zip(
        left: Z,
        right: (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T)
      ): (Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T) =
        (
          left,
          right._1,
          right._2,
          right._3,
          right._4,
          right._5,
          right._6,
          right._7,
          right._8,
          right._9,
          right._10,
          right._11,
          right._12,
          right._13,
          right._14,
          right._15,
          right._16,
          right._17,
          right._18,
          right._19,
          right._20
        )
    }

  implicit def Zippable22Prepend[Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U]
    : Zippable.Out[
      Z,
      (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U),
      (Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U)
    ] =
    new Zippable[Z, (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U)] {
      type Out = (Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U)
      def zip(
        left: Z,
        right: (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U)
      ): (Z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U) =
        (
          left,
          right._1,
          right._2,
          right._3,
          right._4,
          right._5,
          right._6,
          right._7,
          right._8,
          right._9,
          right._10,
          right._11,
          right._12,
          right._13,
          right._14,
          right._15,
          right._16,
          right._17,
          right._18,
          right._19,
          right._20,
          right._21
        )
    }
}

trait ZippableLowPriority3 extends ZippableLowPriority4 {

  implicit def Zippable3[A, B, Z]: Zippable.Out[(A, B), Z, (A, B, Z)] =
    new Zippable[(A, B), Z] {
      type Out = (A, B, Z)
      def zip(left: (A, B), right: Z): (A, B, Z) =
        (left._1, left._2, right)
    }

  implicit def Zippable4[A, B, C, Z]: Zippable.Out[(A, B, C), Z, (A, B, C, Z)] =
    new Zippable[(A, B, C), Z] {
      type Out = (A, B, C, Z)
      def zip(left: (A, B, C), right: Z): (A, B, C, Z) =
        (left._1, left._2, left._3, right)
    }

  implicit def Zippable5[A, B, C, D, Z]: Zippable.Out[(A, B, C, D), Z, (A, B, C, D, Z)] =
    new Zippable[(A, B, C, D), Z] {
      type Out = (A, B, C, D, Z)
      def zip(left: (A, B, C, D), right: Z): (A, B, C, D, Z) =
        (left._1, left._2, left._3, left._4, right)
    }

  implicit def Zippable6[A, B, C, D, E, Z]: Zippable.Out[(A, B, C, D, E), Z, (A, B, C, D, E, Z)] =
    new Zippable[(A, B, C, D, E), Z] {
      type Out = (A, B, C, D, E, Z)
      def zip(left: (A, B, C, D, E), right: Z): (A, B, C, D, E, Z) =
        (left._1, left._2, left._3, left._4, left._5, right)
    }

  implicit def Zippable7[A, B, C, D, E, F, Z]
    : Zippable.Out[(A, B, C, D, E, F), Z, (A, B, C, D, E, F, Z)] =
    new Zippable[(A, B, C, D, E, F), Z] {
      type Out = (A, B, C, D, E, F, Z)
      def zip(left: (A, B, C, D, E, F), right: Z): (A, B, C, D, E, F, Z) =
        (left._1, left._2, left._3, left._4, left._5, left._6, right)
    }

  implicit def Zippable8[A, B, C, D, E, F, G, Z]
    : Zippable.Out[(A, B, C, D, E, F, G), Z, (A, B, C, D, E, F, G, Z)] =
    new Zippable[(A, B, C, D, E, F, G), Z] {
      type Out = (A, B, C, D, E, F, G, Z)
      def zip(left: (A, B, C, D, E, F, G), right: Z): (A, B, C, D, E, F, G, Z) =
        (left._1, left._2, left._3, left._4, left._5, left._6, left._7, right)
    }

  implicit def Zippable9[A, B, C, D, E, F, G, H, Z]
    : Zippable.Out[(A, B, C, D, E, F, G, H), Z, (A, B, C, D, E, F, G, H, Z)] =
    new Zippable[(A, B, C, D, E, F, G, H), Z] {
      type Out = (A, B, C, D, E, F, G, H, Z)
      def zip(left: (A, B, C, D, E, F, G, H), right: Z): (A, B, C, D, E, F, G, H, Z) =
        (left._1, left._2, left._3, left._4, left._5, left._6, left._7, left._8, right)
    }

  implicit def Zippable10[A, B, C, D, E, F, G, H, I, Z]
    : Zippable.Out[(A, B, C, D, E, F, G, H, I), Z, (A, B, C, D, E, F, G, H, I, Z)] =
    new Zippable[(A, B, C, D, E, F, G, H, I), Z] {
      type Out = (A, B, C, D, E, F, G, H, I, Z)
      def zip(left: (A, B, C, D, E, F, G, H, I), right: Z): (A, B, C, D, E, F, G, H, I, Z) =
        (left._1, left._2, left._3, left._4, left._5, left._6, left._7, left._8, left._9, right)
    }

  implicit def Zippable11[A, B, C, D, E, F, G, H, I, J, Z]
    : Zippable.Out[(A, B, C, D, E, F, G, H, I, J), Z, (A, B, C, D, E, F, G, H, I, J, Z)] =
    new Zippable[(A, B, C, D, E, F, G, H, I, J), Z] {
      type Out = (A, B, C, D, E, F, G, H, I, J, Z)
      def zip(left: (A, B, C, D, E, F, G, H, I, J), right: Z): (A, B, C, D, E, F, G, H, I, J, Z) =
        (
          left._1,
          left._2,
          left._3,
          left._4,
          left._5,
          left._6,
          left._7,
          left._8,
          left._9,
          left._10,
          right
        )
    }

  implicit def Zippable12[A, B, C, D, E, F, G, H, I, J, K, Z]
    : Zippable.Out[(A, B, C, D, E, F, G, H, I, J, K), Z, (A, B, C, D, E, F, G, H, I, J, K, Z)] =
    new Zippable[(A, B, C, D, E, F, G, H, I, J, K), Z] {
      type Out = (A, B, C, D, E, F, G, H, I, J, K, Z)
      def zip(
        left: (A, B, C, D, E, F, G, H, I, J, K),
        right: Z
      ): (A, B, C, D, E, F, G, H, I, J, K, Z) =
        (
          left._1,
          left._2,
          left._3,
          left._4,
          left._5,
          left._6,
          left._7,
          left._8,
          left._9,
          left._10,
          left._11,
          right
        )
    }

  implicit def Zippable13[A, B, C, D, E, F, G, H, I, J, K, L, Z]: Zippable.Out[
    (A, B, C, D, E, F, G, H, I, J, K, L),
    Z,
    (A, B, C, D, E, F, G, H, I, J, K, L, Z)
  ] =
    new Zippable[(A, B, C, D, E, F, G, H, I, J, K, L), Z] {
      type Out = (A, B, C, D, E, F, G, H, I, J, K, L, Z)
      def zip(
        left: (A, B, C, D, E, F, G, H, I, J, K, L),
        right: Z
      ): (A, B, C, D, E, F, G, H, I, J, K, L, Z) =
        (
          left._1,
          left._2,
          left._3,
          left._4,
          left._5,
          left._6,
          left._7,
          left._8,
          left._9,
          left._10,
          left._11,
          left._12,
          right
        )
    }

  implicit def Zippable14[A, B, C, D, E, F, G, H, I, J, K, L, M, Z]: Zippable.Out[
    (A, B, C, D, E, F, G, H, I, J, K, L, M),
    Z,
    (A, B, C, D, E, F, G, H, I, J, K, L, M, Z)
  ] =
    new Zippable[(A, B, C, D, E, F, G, H, I, J, K, L, M), Z] {
      type Out = (A, B, C, D, E, F, G, H, I, J, K, L, M, Z)
      def zip(
        left: (A, B, C, D, E, F, G, H, I, J, K, L, M),
        right: Z
      ): (A, B, C, D, E, F, G, H, I, J, K, L, M, Z) =
        (
          left._1,
          left._2,
          left._3,
          left._4,
          left._5,
          left._6,
          left._7,
          left._8,
          left._9,
          left._10,
          left._11,
          left._12,
          left._13,
          right
        )
    }

  implicit def Zippable15[A, B, C, D, E, F, G, H, I, J, K, L, M, N, Z]: Zippable.Out[
    (A, B, C, D, E, F, G, H, I, J, K, L, M, N),
    Z,
    (A, B, C, D, E, F, G, H, I, J, K, L, M, N, Z)
  ] =
    new Zippable[(A, B, C, D, E, F, G, H, I, J, K, L, M, N), Z] {
      type Out = (A, B, C, D, E, F, G, H, I, J, K, L, M, N, Z)
      def zip(
        left: (A, B, C, D, E, F, G, H, I, J, K, L, M, N),
        right: Z
      ): (A, B, C, D, E, F, G, H, I, J, K, L, M, N, Z) =
        (
          left._1,
          left._2,
          left._3,
          left._4,
          left._5,
          left._6,
          left._7,
          left._8,
          left._9,
          left._10,
          left._11,
          left._12,
          left._13,
          left._14,
          right
        )
    }

  implicit def Zippable16[A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, Z]: Zippable.Out[
    (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O),
    Z,
    (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, Z)
  ] =
    new Zippable[(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O), Z] {
      type Out = (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, Z)
      def zip(
        left: (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O),
        right: Z
      ): (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, Z) =
        (
          left._1,
          left._2,
          left._3,
          left._4,
          left._5,
          left._6,
          left._7,
          left._8,
          left._9,
          left._10,
          left._11,
          left._12,
          left._13,
          left._14,
          left._15,
          right
        )
    }

  implicit def Zippable17[A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Z]: Zippable.Out[
    (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P),
    Z,
    (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Z)
  ] =
    new Zippable[(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P), Z] {
      type Out = (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Z)
      def zip(
        left: (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P),
        right: Z
      ): (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Z) =
        (
          left._1,
          left._2,
          left._3,
          left._4,
          left._5,
          left._6,
          left._7,
          left._8,
          left._9,
          left._10,
          left._11,
          left._12,
          left._13,
          left._14,
          left._15,
          left._16,
          right
        )
    }

  implicit def Zippable18[A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, Z]: Zippable.Out[
    (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q),
    Z,
    (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, Z)
  ] =
    new Zippable[(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q), Z] {
      type Out = (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, Z)
      def zip(
        left: (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q),
        right: Z
      ): (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, Z) =
        (
          left._1,
          left._2,
          left._3,
          left._4,
          left._5,
          left._6,
          left._7,
          left._8,
          left._9,
          left._10,
          left._11,
          left._12,
          left._13,
          left._14,
          left._15,
          left._16,
          left._17,
          right
        )
    }

  implicit def Zippable19[A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, Z]: Zippable.Out[
    (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R),
    Z,
    (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, Z)
  ] =
    new Zippable[(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R), Z] {
      type Out = (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, Z)
      def zip(
        left: (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R),
        right: Z
      ): (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, Z) =
        (
          left._1,
          left._2,
          left._3,
          left._4,
          left._5,
          left._6,
          left._7,
          left._8,
          left._9,
          left._10,
          left._11,
          left._12,
          left._13,
          left._14,
          left._15,
          left._16,
          left._17,
          left._18,
          right
        )
    }

  implicit def Zippable20[A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, Z]: Zippable.Out[
    (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S),
    Z,
    (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, Z)
  ] =
    new Zippable[(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S), Z] {
      type Out = (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, Z)
      def zip(
        left: (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S),
        right: Z
      ): (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, Z) =
        (
          left._1,
          left._2,
          left._3,
          left._4,
          left._5,
          left._6,
          left._7,
          left._8,
          left._9,
          left._10,
          left._11,
          left._12,
          left._13,
          left._14,
          left._15,
          left._16,
          left._17,
          left._18,
          left._19,
          right
        )
    }

  implicit def Zippable21[A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, Z]
    : Zippable.Out[
      (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T),
      Z,
      (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, Z)
    ] =
    new Zippable[(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T), Z] {
      type Out = (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, Z)
      def zip(
        left: (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T),
        right: Z
      ): (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, Z) =
        (
          left._1,
          left._2,
          left._3,
          left._4,
          left._5,
          left._6,
          left._7,
          left._8,
          left._9,
          left._10,
          left._11,
          left._12,
          left._13,
          left._14,
          left._15,
          left._16,
          left._17,
          left._18,
          left._19,
          left._20,
          right
        )
    }

  implicit def Zippable22[A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, Z]
    : Zippable.Out[
      (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U),
      Z,
      (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, Z)
    ] =
    new Zippable[(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U), Z] {
      type Out = (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, Z)
      def zip(
        left: (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U),
        right: Z
      ): (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, Z) =
        (
          left._1,
          left._2,
          left._3,
          left._4,
          left._5,
          left._6,
          left._7,
          left._8,
          left._9,
          left._10,
          left._11,
          left._12,
          left._13,
          left._14,
          left._15,
          left._16,
          left._17,
          left._18,
          left._19,
          left._20,
          left._21,
          right
        )
    }
}

trait ZippableLowPriority4 {

  implicit def Zippable2[A, B]: Zippable.Out[A, B, (A, B)] =
    new Zippable[A, B] {
      type Out = (A, B)
      def zip(left: A, right: B): Out = (left, right)
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy