Packages

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.

Source
EitherT.scala
Linear Supertypes
Type Hierarchy
Ordering
  1. Alphabetic
  2. By Inheritance
Inherited
  1. EitherT
  2. Serializable
  3. Serializable
  4. Product
  5. Equals
  6. AnyRef
  7. Any
  1. Hide All
  2. Show All
Visibility
  1. Public
  2. All

Instance Constructors

  1. new EitherT(value: F[Either[A, B]])

Value Members

  1. final def !=(arg0: Any): Boolean
    Definition Classes
    AnyRef → Any
  2. final def ##(): Int
    Definition Classes
    AnyRef → Any
  3. final def ==(arg0: Any): Boolean
    Definition Classes
    AnyRef → Any
  4. def ===(that: EitherT[F, A, B])(implicit eq: Eq[F[Either[A, B]]]): Boolean
  5. def applyAlt[D](ff: EitherT[F, A, (B) ⇒ D])(implicit F: Apply[F]): EitherT[F, A, D]
  6. final def asInstanceOf[T0]: T0
    Definition Classes
    Any
  7. def biSemiflatMap[C, D](fa: (A) ⇒ F[C], fb: (B) ⇒ F[D])(implicit F: Monad[F]): EitherT[F, C, D]

    Combine leftSemiflatMap and semiflatMap together.

    Combine leftSemiflatMap and semiflatMap 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)))
  8. def biflatMap[C, D](fa: (A) ⇒ EitherT[F, C, D], fb: (B) ⇒ EitherT[F, C, D])(implicit F: FlatMap[F]): EitherT[F, C, D]
  9. def bimap[C, D](fa: (A) ⇒ C, fb: (B) ⇒ D)(implicit F: Functor[F]): EitherT[F, C, D]

    Example:

    Example:

    scala> import cats.implicits._
    scala> import cats.data.EitherT
    
    scala> val eitherT: EitherT[List, String, Int] =
         |   EitherT[List, String, Int](List(Right(123), Left("abc")))
    scala> eitherT.bimap(string => string.length, int => int % 100)
    res0: EitherT[List, Int, Int] = EitherT(List(Right(23), Left(3)))
  10. 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]]
  11. def clone(): AnyRef
    Attributes
    protected[lang]
    Definition Classes
    AnyRef
    Annotations
    @throws( ... ) @native() @IntrinsicCandidate()
  12. def collectRight(implicit FA: Alternative[F], FM: Monad[F]): F[B]

    Example:

    Example:

    scala> import cats.implicits._
    scala> import cats.data.EitherT
    
    scala> val eitherT: EitherT[List, String, Int] =
         |   EitherT[List, String, Int](List(Right(123), Left("abc")))
    scala> eitherT.collectRight
    res0: List[Int] = List(123)
  13. 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 an F context.

    Similar to Either#combine but mapped over an F 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)
  14. def compare(that: EitherT[F, A, B])(implicit o: Order[F[Either[A, B]]]): Int
  15. def ensure[AA >: A](onFailure: ⇒ AA)(f: (B) ⇒ Boolean)(implicit F: Functor[F]): EitherT[F, AA, B]

    Example:

    Example:

    scala> import cats.implicits._
    scala> import cats.data.EitherT
    
    scala> val e1: EitherT[List, String, Int] = EitherT[List, String, Int](List(Right(123), Left("abc")))
    scala> e1.ensure("error")(_ > 150)
    res0: EitherT[List, String, Int] = EitherT(List(Left(error), Left(abc)))
    
    scala> val e2: EitherT[List, String, Int] = EitherT[List, String, Int](List(Right(123), Left("abc")))
    scala> e2.ensure("error")(_ > 100)
    res1: EitherT[List, String, Int] = EitherT(List(Right(123), Left(abc)))
  16. def ensureOr[AA >: A](onFailure: (B) ⇒ AA)(f: (B) ⇒ Boolean)(implicit F: Functor[F]): EitherT[F, AA, B]

    Example:

    Example:

    scala> import cats.implicits._
    scala> import cats.data.EitherT
    
    scala> val e1: EitherT[List, String, Int] = EitherT[List, String, Int](List(Right(123), Left("abc")))
    scala> e1.ensureOr(_ => "error")(_ > 100)
    res0: EitherT[List, String, Int] = EitherT(List(Right(123), Left(abc)))
    
    scala> val e2: EitherT[List, String, Int] = EitherT[List, String, Int](List(Right(123), Left("abc")))
    scala> e2.ensureOr(_ => "error")(_ > 150)
    res1: EitherT[List, String, Int] = EitherT(List(Left(error), Left(abc)))
  17. final def eq(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef
  18. def exists(f: (B) ⇒ Boolean)(implicit F: Functor[F]): F[Boolean]

    Example:

    Example:

    scala> import cats.implicits._
    scala> import cats.data.EitherT
    
    scala> val eitherT: EitherT[List, String, Int] = EitherT[List, String, Int](List(Right(123), Left("abc")))
    scala> eitherT.exists(_ > 100)
    res0: List[Boolean] = List(true, false)
  19. def flatMap[AA >: A, D](f: (B) ⇒ EitherT[F, AA, D])(implicit F: Monad[F]): EitherT[F, AA, D]
  20. def flatMapF[AA >: A, D](f: (B) ⇒ F[Either[AA, D]])(implicit F: Monad[F]): EitherT[F, AA, D]
  21. def fold[C](fa: (A) ⇒ C, fb: (B) ⇒ C)(implicit F: Functor[F]): F[C]

    Transform this EitherT[F, A, B] into a F[C].

    Transform this EitherT[F, A, B] into a F[C].

    Example:

    scala> import cats.implicits._
    scala> import cats.data.EitherT
    
    scala> val eitherT: EitherT[List, String, Int] = EitherT[List, String, Int](List(Left("456"), Right(123)))
    scala> eitherT.fold(string => string.toInt, int => int)
    res0: List[Int] = List(456, 123)
  22. def foldF[C](fa: (A) ⇒ F[C], fb: (B) ⇒ F[C])(implicit F: FlatMap[F]): F[C]

    Transform this EitherT[F, A, B] into a F[C].

    Transform this EitherT[F, A, B] into a F[C].

    Example:

    scala> import cats.implicits._
    scala> import cats.data.EitherT
    
    scala> val eitherT: EitherT[List, String, Int] = EitherT[List, String, Int](List(Right(123),Left("abc")))
    scala> eitherT.foldF(string => string.split("").toList, _ => List("123"))
    res0: List[String] = List(123, a, b, c)
  23. def foldLeft[C](c: C)(f: (C, B) ⇒ C)(implicit F: Foldable[F]): C
  24. def foldRight[C](lc: Eval[C])(f: (B, Eval[C]) ⇒ Eval[C])(implicit F: Foldable[F]): Eval[C]
  25. def forall(f: (B) ⇒ Boolean)(implicit F: Functor[F]): F[Boolean]

    Example:

    Example:

    scala> import cats.implicits._
    scala> import cats.data.EitherT
    
    scala> val eitherT: EitherT[List, String, Int] = EitherT[List, String, Int](List(Right(123), Left("abc")))
    scala> eitherT.forall(_ > 100)
    res0: List[Boolean] = List(true, true)
  26. final def getClass(): Class[_]
    Definition Classes
    AnyRef → Any
    Annotations
    @native() @IntrinsicCandidate()
  27. def getOrElse[BB >: B](default: ⇒ BB)(implicit F: Functor[F]): F[BB]

    Example:

    Example:

    scala> import cats.implicits._
    scala> import cats.data.EitherT
    
    scala> val eitherT: EitherT[List,String,Int] = EitherT[List, String,Int](List(Right(123),Left("abc")))
    scala> eitherT.getOrElse(456)
    res0: List[Int] = List(123, 456)
  28. def getOrElseF[BB >: B](default: ⇒ F[BB])(implicit F: Monad[F]): F[BB]

    Example:

    Example:

    scala> import cats.implicits._
    scala> import cats.data.EitherT
    
    scala> val eitherT: EitherT[List,String,Int] = EitherT[List, String,Int](List(Right(123),Left("abc")))
    scala> eitherT.getOrElseF(List(456))
    res0: List[Int] = List(123, 456)
  29. final def isInstanceOf[T0]: Boolean
    Definition Classes
    Any
  30. def isLeft(implicit F: Functor[F]): F[Boolean]

    Example:

    Example:

    scala> import cats.implicits._
    scala> import cats.data.EitherT
    
    scala> val eitherT: EitherT[List,String,Int] = EitherT[List, String,Int](List(Right(123),Left("abc")))
    scala> eitherT.isLeft
    res0: List[Boolean] = List(false, true)
  31. def isRight(implicit F: Functor[F]): F[Boolean]

    Example:

    Example:

    scala> import cats.implicits._
    scala> import cats.data.EitherT
    
    scala> val eitherT: EitherT[List,String,Int] = EitherT[List, String,Int](List(Right(123),Left("abc")))
    scala> eitherT.isRight
    res0: List[Boolean] = List(true, false)
  32. def leftFlatMap[BB >: B, C](f: (A) ⇒ EitherT[F, C, BB])(implicit F: Monad[F]): EitherT[F, C, BB]
  33. def leftMap[C](f: (A) ⇒ C)(implicit F: Functor[F]): EitherT[F, C, B]
  34. def leftSemiflatMap[D](f: (A) ⇒ F[D])(implicit F: Monad[F]): EitherT[F, D, B]
  35. def leftSemiflatTap[C](f: (A) ⇒ F[C])(implicit F: Monad[F]): EitherT[F, A, B]
  36. def map[D](f: (B) ⇒ D)(implicit F: Functor[F]): EitherT[F, A, D]
  37. def mapK[G[_]](f: ~>[F, G]): EitherT[G, A, B]

    Modify the context F using transformation f.

  38. def merge[AA >: A](implicit ev: <:<[B, AA], F: Functor[F]): F[AA]
  39. final def ne(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef
  40. final def notify(): Unit
    Definition Classes
    AnyRef
    Annotations
    @native() @IntrinsicCandidate()
  41. final def notifyAll(): Unit
    Definition Classes
    AnyRef
    Annotations
    @native() @IntrinsicCandidate()
  42. def orElse[C, BB >: B](default: ⇒ EitherT[F, C, BB])(implicit F: Monad[F]): EitherT[F, C, BB]

    Example:

    Example:

    scala> import cats.implicits._
    scala> import cats.data.EitherT
    
    scala> val e1: EitherT[Option,String,Int] = EitherT[Option, String,Int](Some(Right(123)))
    scala> e1.orElse(EitherT[Option,Boolean,Int](Some(Right(456))))
    res0: EitherT[Option, Boolean, Int] = EitherT(Some(Right(123)))
    
    scala> val e2: EitherT[Option,String,Int] = EitherT[Option, String,Int](Some(Left("abc")))
    scala> e2.orElse(EitherT[Option,Boolean,Int](Some(Left(true))))
    res1: EitherT[Option, Boolean, Int] = EitherT(Some(Left(true)))
  43. def partialCompare(that: EitherT[F, A, B])(implicit p: PartialOrder[F[Either[A, B]]]): Double
  44. def recover(pf: PartialFunction[A, B])(implicit F: Functor[F]): EitherT[F, A, B]

    Example:

    Example:

    scala> import cats.implicits._
    scala> import cats.data.EitherT
    
    scala> val eitherT: EitherT[List,String,Int] =
         |   EitherT[List, String,Int](List(Right(123),Left("abc")))
    scala> val pf: PartialFunction[String, Int] = {case "abc" => 456}
    scala> eitherT.recover(pf)
    res0: EitherT[List, String, Int] = EitherT(List(Right(123), Right(456)))
  45. def recoverWith(pf: PartialFunction[A, EitherT[F, A, B]])(implicit F: Monad[F]): EitherT[F, A, B]

    Example:

    Example:

    scala> import cats.implicits._
    scala> import cats.data.EitherT
    
    scala> val eitherT: EitherT[List,String,Int] =
         |   EitherT[List, String,Int](List(Right(123),Left("abc")))
    scala> val pf: PartialFunction[String, EitherT[List, String, Int]] =
         |   {case "abc" => EitherT[List, String, Int](List(Right(456)))}
    scala> eitherT.recoverWith(pf)
    res0: EitherT[List, String, Int] = EitherT(List(Right(123), Right(456)))
  46. def rethrowT(implicit F: MonadError[F, _ >: A]): F[B]

    Inverse of MonadError#attemptT Given MonadError[F, E :> A] transforms Either[F, A, B] to F[B] If the value was B, F[B] is successful If the value was A, F[B] is failed with E

    Inverse of MonadError#attemptT Given MonadError[F, E :> A] transforms Either[F, A, B] to F[B] If the value was B, F[B] is successful If the value was A, F[B] is failed with E

    Example:

    scala> import cats.implicits._
    scala> import cats.data.EitherT
    
    scala> val e1: EitherT[Option, Unit, Int] = EitherT[Option, Unit, Int](Some(Right(123)))
    scala> e1.rethrowT
    res0: Option[Int] = Some(123)
    
    scala> val e2: EitherT[Option, Unit, Int] = EitherT[Option, Unit, Int](Some(Left(())))
    scala> e2.rethrowT
    res1: Option[Int] = None
    
    scala> import scala.util.Try
    scala> import java.lang.Exception
    
    scala> val e3: EitherT[Try, Throwable, String] = EitherT[Try, Throwable, String](Try(Right("happy cats")))
    scala> e3.rethrowT
    res2: util.Try[String] = Success(happy cats)
    
    scala> val e4: EitherT[Try, Throwable, String] = EitherT[Try, Throwable, String](Try(Left(new Exception("sad cats"))))
    scala> e4.rethrowT
    res3: util.Try[String] = Failure(java.lang.Exception: sad cats)
  47. def semiflatMap[D](f: (B) ⇒ F[D])(implicit F: Monad[F]): EitherT[F, A, D]
  48. def semiflatTap[C](f: (B) ⇒ F[C])(implicit F: Monad[F]): EitherT[F, A, B]
  49. def show(implicit show: Show[F[Either[A, B]]]): String
  50. def subflatMap[AA >: A, D](f: (B) ⇒ Either[AA, D])(implicit F: Functor[F]): EitherT[F, AA, D]
  51. def swap(implicit F: Functor[F]): EitherT[F, B, A]

    Example:

    Example:

    scala> import cats.implicits._
    scala> import cats.data.EitherT
    
    scala> val eitherT: EitherT[List,String,Int] = EitherT[List, String,Int](List(Right(123),Left("abc")))
    scala> eitherT.swap
    res0: EitherT[List,Int,String] = EitherT(List(Left(123), Right(abc)))
  52. final def synchronized[T0](arg0: ⇒ T0): T0
    Definition Classes
    AnyRef
  53. def to[G[_]](implicit F: Functor[F], G: Alternative[G]): F[G[B]]

    Example:

    Example:

    scala> import cats.implicits._
    scala> import cats.data.EitherT
    
    scala> val eitherT: EitherT[List, String, Int] = EitherT[List, String, Int](List(Right(123), Left("abc")))
    scala> eitherT.to[Option]
    res0: List[Option[Int]] = List(Some(123), None)
  54. def toNested: Nested[F, [β$2$]Either[A, β$2$], B]

    Transform this EitherT[F, A, B] into a Nested[F, Either[A, *], B].

    Transform this EitherT[F, A, B] into a Nested[F, Either[A, *], B].

    An example where toNested can be used, is to get the Apply.ap function with the behavior from the composed Apply instances from F and Either[A, *], which is inconsistent with the behavior of the ap from Monad of EitherT.

    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)))
  55. def toNestedValidated(implicit F: Functor[F]): Nested[F, [β$4$]Validated[A, β$4$], B]

    Transform this EitherT[F, A, B] into a Nested[F, Validated[A, *], B].

    Transform this EitherT[F, A, B] into a Nested[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)))
  56. def toNestedValidatedNec(implicit F: Functor[F]): Nested[F, [β$8$]Validated[Type[A], β$8$], B]

    Transform this EitherT[F, A, B] into a Nested[F, ValidatedNec[A, *], B].

  57. def toNestedValidatedNel(implicit F: Functor[F]): Nested[F, [β$6$]Validated[NonEmptyList[A], β$6$], B]

    Transform this EitherT[F, A, B] into a Nested[F, ValidatedNel[A, *], B].

  58. def toOption(implicit F: Functor[F]): OptionT[F, B]

    Example:

    Example:

    scala> import cats.implicits._
    scala> import cats.data.EitherT
    
    scala> val eitherT: EitherT[List, String, Int] = EitherT[List, String, Int](List(Right(123), Left("abc")))
    scala> eitherT.toOption
    res0: OptionT[List, Int] = OptionT(List(Some(123), None))
  59. def toValidated(implicit F: Functor[F]): F[Validated[A, B]]
  60. def toValidatedNec(implicit F: Functor[F]): F[ValidatedNec[A, B]]
  61. def toValidatedNel(implicit F: Functor[F]): F[ValidatedNel[A, B]]
  62. def transform[C, D](f: (Either[A, B]) ⇒ Either[C, D])(implicit F: Functor[F]): EitherT[F, C, D]
  63. def traverse[G[_], D](f: (B) ⇒ G[D])(implicit traverseF: Traverse[F], applicativeG: Applicative[G]): G[EitherT[F, A, D]]
  64. val value: F[Either[A, B]]
  65. def valueOr[BB >: B](f: (A) ⇒ BB)(implicit F: Functor[F]): F[BB]

    Example:

    Example:

    scala> import cats.implicits._
    scala> import cats.data.EitherT
    
    scala> val eitherT: EitherT[List, String, Int] = EitherT[List, String, Int](List(Right(123), Left("abc")))
    scala> eitherT.valueOr(_.length)
    res0: List[Int] = List(123, 3)
  66. def valueOrF[BB >: B](f: (A) ⇒ F[BB])(implicit F: Monad[F]): F[BB]

    Example:

    Example:

    scala> import cats.implicits._
    scala> import cats.data.EitherT
    
    scala> val eitherT: EitherT[List, String, Int] = EitherT[List, String, Int](List(Right(123), Left("abc")))
    scala> eitherT.valueOrF(string => List(string.length))
    res0: List[Int] = List(123, 3)
  67. final def wait(arg0: Long, arg1: Int): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  68. final def wait(arg0: Long): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws( ... ) @native()
  69. final def wait(): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  70. def withValidated[C, D](f: (Validated[A, B]) ⇒ Validated[C, D])(implicit F: Functor[F]): EitherT[F, C, D]

    Run this value as a Validated against the function and convert it back to an EitherT.

    Run this value as a Validated against the function and convert it back to an EitherT.

    The Applicative instance for EitherT "fails fast" - it is often useful to "momentarily" have it accumulate errors instead, which is what the Validated 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))))

Deprecated Value Members

  1. def finalize(): Unit
    Attributes
    protected[lang]
    Definition Classes
    AnyRef
    Annotations
    @throws( classOf[java.lang.Throwable] ) @Deprecated
    Deprecated

Inherited from Serializable

Inherited from Serializable

Inherited from Product

Inherited from Equals

Inherited from AnyRef

Inherited from Any

Ungrouped