Skip to content

Instantly share code, notes, and snippets.

@seanparsons
Created October 16, 2013 10:08
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save seanparsons/7005543 to your computer and use it in GitHub Desktop.
Save seanparsons/7005543 to your computer and use it in GitHub Desktop.
Stacking ReaderT and OptionT.
import scalaz._,Scalaz._,scalaz.effect._,OptionT._,Kleisli._
type OptionTIO[+X] = OptionT[IO, X]
val reader1: ReaderT[Option, Int, String] = kleisli[Option, Int, String](n => n.toString.some)
val reader2: ReaderT[IO, Int, String] = kleisli[IO, Int, String](n => IO((n * 2).toString))
val convertedReader1: ReaderT[OptionTIO, Int, String] = reader1.mapK[OptionTIO, String](opt => optionT(IO(opt)))
val convertedReader2: ReaderT[OptionTIO, Int, String] = reader2.mapK[OptionTIO, String](io => io.liftM[OptionT])
val composed = for {
first <- convertedReader1
second <- convertedReader2
} yield first + " - " + second
composed
.run(4) // ReaderT
.run // OptionT
.unsafePerformIO // IO
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment