membership-attribute-service/app/utils/OptionTEither.scala (22 lines of code) (raw):

package utils import scalaz.{OptionT, \/} import utils.SimpleEitherT.SimpleEitherT import scala.concurrent.{ExecutionContext, Future} object OptionTEither { type OptionTEither[A] = OptionT[SimpleEitherT, A] def apply[A](m: Future[\/[String, Option[A]]]): OptionTEither[A] = OptionT[SimpleEitherT, A](SimpleEitherT(m)) private def liftOptionDisjunction[A](x: Future[\/[String, A]])(implicit ex: ExecutionContext): OptionTEither[A] = apply(x.map(_.map[Option[A]](Some.apply))) def liftOption[A](x: Future[Either[String, A]])(implicit ex: ExecutionContext): OptionTEither[A] = liftOptionDisjunction(x.map(\/.fromEither)) def some[A](value: A)(implicit ex: ExecutionContext): OptionTEither[A] = apply(SimpleEitherT.right(Option(value)).run) def fromOption[A](x: Option[A]): OptionTEither[A] = apply(Future.successful(\/.right[String, Option[A]](x))) def fromFutureOption[A](future: Future[Option[A]])(implicit ex: ExecutionContext): OptionTEither[A] = { apply(future.map(\/.right[String, Option[A]](_))) } def fromFuture[A](future: Future[A])(implicit ex: ExecutionContext): OptionTEither[A] = fromFutureOption(future.map(Some(_))) }