membership-attribute-service/app/utils/SimpleEitherT.scala (29 lines of code) (raw):
package utils
import scalaz.std.scalaFuture._
import scalaz.{EitherT, \/}
import utils.ListTEither.ListTEither
import scala.concurrent.{ExecutionContext, Future}
object SimpleEitherT {
type SimpleEitherT[A] = EitherT[String, Future, A]
def apply[T](f: Future[\/[String, T]]): SimpleEitherT[T] = EitherT(f)
def apply[T](f: Future[Either[String, T]])(implicit ec: ExecutionContext): SimpleEitherT[T] =
SimpleEitherT(f.map(\/.fromEither))
def rightT[T](x: Future[T])(implicit ec: ExecutionContext): SimpleEitherT[T] = {
SimpleEitherT[T](x.map(\/.right[String, T]))
}
def leftT[T](x: Future[String])(implicit ec: ExecutionContext): SimpleEitherT[T] = {
SimpleEitherT[T](x.map(\/.left[String, T]))
}
def right[T](x: T)(implicit ec: ExecutionContext): SimpleEitherT[T] =
rightT(Future.successful(x))
def left[T](x: String)(implicit ec: ExecutionContext): SimpleEitherT[T] =
leftT[T](Future.successful(x))
def fromFutureOption[T](f: Future[\/[String, Option[T]]], errorMessage: String)(implicit ec: ExecutionContext): SimpleEitherT[T] =
SimpleEitherT(f).flatMap {
case Some(value) => right(value)
case _ => left(errorMessage)
}
def fromEither[T](either: Either[String, T])(implicit ec: ExecutionContext): SimpleEitherT[T] =
apply(Future.successful(either))
def fromListT[T](value: ListTEither[T])(implicit ec: ExecutionContext): SimpleEitherT[List[T]] = SimpleEitherT(value.toList.run)
}