Created
July 7, 2014 11:29
-
-
Save noelmarkham/5b9b7391d8ac79a0d228 to your computer and use it in GitHub Desktop.
Monad Transformers
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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