Skip to content

Instantly share code, notes, and snippets.

@gigiigig
Last active September 28, 2015 07:05
Show Gist options
  • Save gigiigig/de91df8542a34ba50cfa to your computer and use it in GitHub Desktop.
Save gigiigig/de91df8542a34ba50cfa to your computer and use it in GitHub Desktop.
Free Monad
import scalaz._, Scalaz._
import scalaz.concurrent.Task
object console extends App {
trait Op[T]
case class Read[T](t: T) extends Op[T]
case class Write[T](t: T) extends Op[T]
type OpC[T] = Coyoneda[Op, T]
def read[T](t: T) = Free.liftF[OpC, T](Coyoneda.lift(Read(t)))
def write[T](t: T) = Free.liftF[OpC, T](Coyoneda.lift(Write(t)))
val res = for {
r <- read("ciao")
w <- write("foo")
} yield (r + w)
def foo = new (Op ~> Task) {
def apply[T](op: Op[T]) = op match {
case Read(s) => Task.fork(Task.delay{
Thread.sleep(500); println("read"); s
})
case Write(s) => Task.fork(Task.delay{
Thread.sleep(700); println("write"); s
})
}
}
println(s"res: ${Free.runFC(res)(foo).run}")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment