final case class EitherT[F[_], A, B](value: F[Either[A, B]]) extends Product with Serializable
Transformer for Either
, allowing the effect of an arbitrary type constructor F
to be combined with the
fail-fast effect of Either
.
EitherT[F, A, B]
wraps a value of type F[Either[A, B]]
. An F[C]
can be lifted in to EitherT[F, A, C]
via EitherT.right
,
and lifted in to a EitherT[F, C, B]
via EitherT.left
.
- Alphabetic
- By Inheritance
- EitherT
- Serializable
- Serializable
- Product
- Equals
- AnyRef
- Any
- Hide All
- Show All
- Public
- All
Instance Constructors
- new EitherT(value: F[Either[A, B]])
Value Members
-
final
def
!=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
##(): Int
- Definition Classes
- AnyRef → Any
-
final
def
==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- def ===(that: EitherT[F, A, B])(implicit eq: Eq[F[Either[A, B]]]): Boolean
- def applyAlt[D](ff: EitherT[F, A, (B) ⇒ D])(implicit F: Apply[F]): EitherT[F, A, D]
-
final
def
asInstanceOf[T0]: T0
- Definition Classes
- Any
-
def
biSemiflatMap[C, D](fa: (A) ⇒ F[C], fb: (B) ⇒ F[D])(implicit F: Monad[F]): EitherT[F, C, D]
Combine
leftSemiflatMap
andsemiflatMap
together.Combine
leftSemiflatMap
andsemiflatMap
together.Example:
scala> import cats.implicits._ scala> import cats.data.EitherT scala> val eitherT: EitherT[List, String, Int] = EitherT[List, String, Int](List(Left("abc"), Right(123))) scala> eitherT.biSemiflatMap(string => List(string.length), int => List(int.toFloat)) res0: cats.data.EitherT[List,Int,Float] = EitherT(List(Left(3), Right(123.0)))
- def biflatMap[AA >: A, BB >: B](fa: (A) ⇒ EitherT[F, AA, BB], fb: (B) ⇒ EitherT[F, AA, BB])(implicit F: FlatMap[F]): EitherT[F, AA, BB]
- def bimap[C, D](fa: (A) ⇒ C, fb: (B) ⇒ D)(implicit F: Functor[F]): EitherT[F, C, D]
- def bitraverse[G[_], C, D](f: (A) ⇒ G[C], g: (B) ⇒ G[D])(implicit traverseF: Traverse[F], applicativeG: Applicative[G]): G[EitherT[F, C, D]]
-
def
clone(): AnyRef
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @native() @throws( ... )
- def collectRight(implicit FA: Alternative[F], FM: Monad[F]): F[B]
-
def
combine(that: EitherT[F, A, B])(implicit F: Apply[F], B: Semigroup[B]): EitherT[F, A, B]
Similar to
Either#combine
but mapped over anF
context.Similar to
Either#combine
but mapped over anF
context.Examples:
scala> import cats.data.EitherT scala> import cats.implicits._ scala> val l1: EitherT[Option, String, Int] = EitherT.left(Some("error 1")) scala> val l2: EitherT[Option, String, Int] = EitherT.left(Some("error 2")) scala> val r3: EitherT[Option, String, Int] = EitherT.right(Some(3)) scala> val r4: EitherT[Option, String, Int] = EitherT.right(Some(4)) scala> val noneEitherT: EitherT[Option, String, Int] = EitherT.left(None) scala> l1 combine l2 res0: EitherT[Option, String, Int] = EitherT(Some(Left(error 1))) scala> l1 combine r3 res1: EitherT[Option, String, Int] = EitherT(Some(Left(error 1))) scala> r3 combine l1 res2: EitherT[Option, String, Int] = EitherT(Some(Left(error 1))) scala> r3 combine r4 res3: EitherT[Option, String, Int] = EitherT(Some(Right(7))) scala> l1 combine noneEitherT res4: EitherT[Option, String, Int] = EitherT(None) scala> noneEitherT combine l1 res5: EitherT[Option, String, Int] = EitherT(None) scala> r3 combine noneEitherT res6: EitherT[Option, String, Int] = EitherT(None) scala> noneEitherT combine r4 res7: EitherT[Option, String, Int] = EitherT(None)
- def compare(that: EitherT[F, A, B])(implicit o: Order[F[Either[A, B]]]): Int
- def ensure[AA >: A](onFailure: ⇒ AA)(f: (B) ⇒ Boolean)(implicit F: Functor[F]): EitherT[F, AA, B]
- def ensureOr[AA >: A](onFailure: (B) ⇒ AA)(f: (B) ⇒ Boolean)(implicit F: Functor[F]): EitherT[F, AA, B]
-
final
def
eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- def exists(f: (B) ⇒ Boolean)(implicit F: Functor[F]): F[Boolean]
-
def
finalize(): Unit
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( classOf[java.lang.Throwable] )
- def flatMap[AA >: A, D](f: (B) ⇒ EitherT[F, AA, D])(implicit F: Monad[F]): EitherT[F, AA, D]
- def flatMapF[AA >: A, D](f: (B) ⇒ F[Either[AA, D]])(implicit F: Monad[F]): EitherT[F, AA, D]
- def fold[C](fa: (A) ⇒ C, fb: (B) ⇒ C)(implicit F: Functor[F]): F[C]
- def foldLeft[C](c: C)(f: (C, B) ⇒ C)(implicit F: Foldable[F]): C
- def foldRight[C](lc: Eval[C])(f: (B, Eval[C]) ⇒ Eval[C])(implicit F: Foldable[F]): Eval[C]
- def forall(f: (B) ⇒ Boolean)(implicit F: Functor[F]): F[Boolean]
-
final
def
getClass(): Class[_]
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
- def getOrElse[BB >: B](default: ⇒ BB)(implicit F: Functor[F]): F[BB]
- def getOrElseF[BB >: B](default: ⇒ F[BB])(implicit F: Monad[F]): F[BB]
-
final
def
isInstanceOf[T0]: Boolean
- Definition Classes
- Any
- def isLeft(implicit F: Functor[F]): F[Boolean]
- def isRight(implicit F: Functor[F]): F[Boolean]
- def leftFlatMap[BB >: B, D](f: (A) ⇒ EitherT[F, D, BB])(implicit F: Monad[F]): EitherT[F, D, BB]
- def leftMap[C](f: (A) ⇒ C)(implicit F: Functor[F]): EitherT[F, C, B]
- def leftSemiflatMap[D](f: (A) ⇒ F[D])(implicit F: Monad[F]): EitherT[F, D, B]
- def map[D](f: (B) ⇒ D)(implicit F: Functor[F]): EitherT[F, A, D]
-
def
mapK[G[_]](f: ~>[F, G]): EitherT[G, A, B]
Modify the context
F
using transformationf
. - def merge[AA >: A](implicit ev: <:<[B, AA], F: Functor[F]): F[AA]
-
final
def
ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
final
def
notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
-
final
def
notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
- def orElse[AA, BB >: B](default: ⇒ EitherT[F, AA, BB])(implicit F: Monad[F]): EitherT[F, AA, BB]
- def partialCompare(that: EitherT[F, A, B])(implicit p: PartialOrder[F[Either[A, B]]]): Double
- def recover(pf: PartialFunction[A, B])(implicit F: Functor[F]): EitherT[F, A, B]
- def recoverWith(pf: PartialFunction[A, EitherT[F, A, B]])(implicit F: Monad[F]): EitherT[F, A, B]
-
def
rethrowT(implicit F: MonadError[F, A]): F[B]
Inverse of
MonadError#attemptT
- def semiflatMap[D](f: (B) ⇒ F[D])(implicit F: Monad[F]): EitherT[F, A, D]
- def show(implicit show: Show[F[Either[A, B]]]): String
- def subflatMap[AA >: A, D](f: (B) ⇒ Either[AA, D])(implicit F: Functor[F]): EitherT[F, AA, D]
- def swap(implicit F: Functor[F]): EitherT[F, B, A]
-
final
def
synchronized[T0](arg0: ⇒ T0): T0
- Definition Classes
- AnyRef
- def to[G[_]](implicit F: Functor[F], G: Alternative[G]): F[G[B]]
-
def
toNested: Nested[F, [β$2$]Either[A, β$2$], B]
Transform this
EitherT[F, A, B]
into aNested[F, Either[A, ?], B]
.Transform this
EitherT[F, A, B]
into aNested[F, Either[A, ?], B]
.An example where
toNested
can be used, is to get theApply.ap
function with the behavior from the composedApply
instances fromF
andEither[A, ?]
, which is inconsistent with the behavior of theap
fromMonad
ofEitherT
.scala> import cats.data.EitherT scala> import cats.implicits._ scala> val ff: EitherT[List, String, Int => String] = | EitherT(List(Either.right(_.toString), Either.left("error"))) scala> val fa: EitherT[List, String, Int] = | EitherT(List(Either.right(1), Either.right(2))) scala> ff.ap(fa) res0: EitherT[List,String,String] = EitherT(List(Right(1), Right(2), Left(error))) scala> EitherT((ff.toNested).ap(fa.toNested).value) res1: EitherT[List,String,String] = EitherT(List(Right(1), Right(2), Left(error), Left(error)))
-
def
toNestedValidated(implicit F: Functor[F]): Nested[F, [β$4$]Validated[A, β$4$], B]
Transform this
EitherT[F, A, B]
into aNested[F, Validated[A, ?], B]
.Transform this
EitherT[F, A, B]
into aNested[F, Validated[A, ?], B]
.Example:
scala> import cats.data.{EitherT, Validated} scala> import cats.implicits._ scala> val f: Int => String = i => (i*2).toString scala> val r1: EitherT[Option, String, Int => String] = EitherT.right(Some(f)) r1: cats.data.EitherT[Option,String,Int => String] = EitherT(Some(Right(<function1>))) scala> val r2: EitherT[Option, String, Int] = EitherT.right(Some(10)) r2: cats.data.EitherT[Option,String,Int] = EitherT(Some(Right(10))) scala> type ErrorOr[A] = Validated[String, A] scala> (r1.toNestedValidated).ap(r2.toNestedValidated) res0: cats.data.Nested[Option,ErrorOr,String] = Nested(Some(Valid(20)))
-
def
toNestedValidatedNec(implicit F: Functor[F]): Nested[F, [β$8$]Validated[Type[A], β$8$], B]
Transform this
EitherT[F, A, B]
into aNested[F, ValidatedNec[A, ?], B]
. -
def
toNestedValidatedNel(implicit F: Functor[F]): Nested[F, [β$6$]Validated[NonEmptyList[A], β$6$], B]
Transform this
EitherT[F, A, B]
into aNested[F, ValidatedNel[A, ?], B]
. - def toOption(implicit F: Functor[F]): OptionT[F, B]
- def toValidated(implicit F: Functor[F]): F[Validated[A, B]]
- def toValidatedNec(implicit F: Functor[F]): F[ValidatedNec[A, B]]
- def toValidatedNel(implicit F: Functor[F]): F[ValidatedNel[A, B]]
- def transform[C, D](f: (Either[A, B]) ⇒ Either[C, D])(implicit F: Functor[F]): EitherT[F, C, D]
- def traverse[G[_], D](f: (B) ⇒ G[D])(implicit traverseF: Traverse[F], applicativeG: Applicative[G]): G[EitherT[F, A, D]]
- val value: F[Either[A, B]]
- def valueOr[BB >: B](f: (A) ⇒ BB)(implicit F: Functor[F]): F[BB]
- def valueOrF[BB >: B](f: (A) ⇒ F[BB])(implicit F: Monad[F]): F[BB]
-
final
def
wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @native() @throws( ... )
-
def
withValidated[AA, BB](f: (Validated[A, B]) ⇒ Validated[AA, BB])(implicit F: Functor[F]): EitherT[F, AA, BB]
Run this value as a
Validated
against the function and convert it back to anEitherT
.Run this value as a
Validated
against the function and convert it back to anEitherT
.The Applicative instance for
EitherT
"fails fast" - it is often useful to "momentarily" have it accumulate errors instead, which is what theValidated
data type gives us.Example:
scala> import cats.implicits._ scala> type Error = String scala> val v1: Validated[NonEmptyList[Error], Int] = Validated.invalidNel("error 1") scala> val v2: Validated[NonEmptyList[Error], Int] = Validated.invalidNel("error 2") scala> val eithert: EitherT[Option, Error, Int] = EitherT.leftT[Option, Int]("error 3") scala> eithert.withValidated { v3 => (v1, v2, v3.toValidatedNel).mapN { case (i, j, k) => i + j + k } } res0: EitherT[Option, NonEmptyList[Error], Int] = EitherT(Some(Left(NonEmptyList(error 1, error 2, error 3))))