Skip to content

Instantly share code, notes, and snippets.

@noelmarkham
Created July 7, 2014 11:29
Show Gist options
  • Save noelmarkham/5b9b7391d8ac79a0d228 to your computer and use it in GitHub Desktop.
Save noelmarkham/5b9b7391d8ac79a0d228 to your computer and use it in GitHub Desktop.
Monad Transformers
import scalaz._
import syntax.std.option._
import OptionT._
import scala.concurrent._
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global
val o1 = 1.some
val o2 = 2.some
val fo1: Future[Option[Int]] = Future.successful(o1)
val fo2: Future[Option[Int]] = Future.successful(o2)
val res1 = Await.result(fo1, 1.second)
val sum1F = for {
intOpt1 <- fo1
intOpt2 <- fo2
} yield {
for {
int1 <- intOpt1
int2 <- intOpt2
} yield int1 + int2
}
val sum1 = Await.result(sum1F, 1.second)
implicit val futureMonad: Monad[Future] = new Monad[Future] {
override def point[A](a: => A): Future[A] = Future.successful(a)
override def bind[A, B](fa: Future[A])(f: (A) => Future[B]): Future[B] = fa flatMap f
}
val sum2F: OptionT[Future, Int] = for {
int1 <- optionT[Future](fo1)
int2 <- optionT[Future](fo2)
} yield int1 + int2
val sum2 = Await.result(sum2F.run, 1.second)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment