scalaz.Altz.scala Maven / Gradle / Ivy
// Copyright: 2017 - 2024 Sam Halliday
// License: http://www.gnu.org/licenses/lgpl-3.0.en.html
package scalaz
import scala.inline
import iotaz._
import iotaz.TList.::
import Cops._
/**
* Generic extension of Alt implementing Deriving.
*/
trait Altz[F[_]] extends Applicativez[F] with Alt[F] with InvariantAltz[F] {
def altlyz[Z, A <: TList, FA <: TList](tcs: Prod[FA])(f: Cop[A] => Z)(implicit
ev: A PairedWith FA
): F[Z]
// derived combinators
override final def xcoproductz[Z, A <: TList, FA <: TList](
tcs: Prod[FA]
)(
f: Cop[A] => Z,
@unused g: Z => Cop[A]
)(implicit
ev: A PairedWith FA
): F[Z] = altlyz(tcs)(f)
override def alt[A](a1: =>F[A], a2: =>F[A]): F[A] =
altly2(a1, a2) {
case -\/(a) => a
case \/-(a) => a
}
override def altly1[Z, A1](a1: =>F[A1])(f: A1 => Z): F[Z] = {
type L = A1 :: TNil
altlyz(LazyProd(a1))((c: Cop[L]) => f(to1(c)))
}
override def altly2[Z, A1, A2](a1: =>F[A1], a2: =>F[A2])(
f: A1 \/ A2 => Z
): F[Z] = {
type L = A1 :: A2 :: TNil
altlyz(LazyProd(a1, a2))((c: Cop[L]) => f(to2(c)))
}
override def altly3[Z, A1, A2, A3](a1: =>F[A1], a2: =>F[A2], a3: =>F[A3])(
f: A1 \/ (A2 \/ A3) => Z
): F[Z] = {
type L = A1 :: A2 :: A3 :: TNil
altlyz(LazyProd(a1, a2, a3))((c: Cop[L]) => f(to3(c)))
}
override def altly4[Z, A1, A2, A3, A4](
a1: =>F[A1],
a2: =>F[A2],
a3: =>F[A3],
a4: =>F[A4]
)(
f: A1 \/ (A2 \/ (A3 \/ A4)) => Z
): F[Z] = {
type L = A1 :: A2 :: A3 :: A4 :: TNil
altlyz(LazyProd(a1, a2, a3, a4))((c: Cop[L]) => f(to4(c)))
}
}
object Altz {
@inline def apply[F[_]](implicit i: Altz[F]): Altz[F] = i
}