app/lib/FutureO.scala (19 lines of code) (raw):

package lib import scala.concurrent.Future import scala.concurrent.ExecutionContext.Implicits.global case class FutureO[T](futureOption: Future[Option[T]]) { def flatMap[S](f: T => FutureO[S]): FutureO[S] = { FutureO(futureOption.flatMap { optS => optS.map(f(_).futureOption).getOrElse(Future.successful(None)) }) } def map[S](f: T => S): FutureO[S] = { FutureO(futureOption.map { optS => optS.map(f(_)) }) } } object FutureO { def toOpt[T](f: Future[T]) = FutureO(f.map(Some(_))) def toFut[T](o: Option[T]) = FutureO(Future.successful(o)) }