Usually, when you want to turn type constructors inside out, you're probably looking for sequence . If you included -Ypartial-unification in Scala> = 2.11.9, you can just let the compiler do everything:
data.sequence
Otherwise:
type EitherError[A] = Either[Error, A] data.sequence[EitherError, User]
Or if you have type lambda plugin :
data.sequence[Either[Error, ?], User]
Or if you donβt have a plugin but donβt like type aliases:
data.sequence[({type L[A] = Either[Error, A]})
It will do the expected thing, either returning the first error, or all users if there is no error. If we pretend that users are int and errors are strings:
scala> import cats.data.NonEmptyList, cats.implicits._ import cats.data.NonEmptyList import cats.implicits._ scala> val data: NonEmptyList[Either[Error, User]] = NonEmptyList.of(Right(2), Left("error1"), Right(4)) data: cats.data.NonEmptyList[Either[Error,User]] = NonEmptyList(Right(2), Left(error1), Right(4)) scala> data.sequence res4: Either[Error,cats.data.NonEmptyList[User]] = Left(error1)
source share