Visit the microsite for description.
Runnable with scala-cli
. Turbolift requires
//> using scala "3.3.3"
//> using dep "io.github.marcinzh::turbolift-core:0.98.0"
import turbolift.!!
import turbolift.effects.{Reader, State, Error}
@main def main =
case object MyReader extends Reader[Int]
case object MyState extends State[Int]
case object MyError extends Error[String]
val program =
for
a <- MyState.get
b <- MyReader.ask
c <-
if b != 0
then !!.pure(a / b)
else MyError.raise(s"Tried to divide $a by zero")
_ <- MyState.put(c)
yield ()
val result =
program
.handleWith(MyState.handler(100))
.handleWith(MyReader.handler(3))
.handleWith(MyError.handler)
.run
println(result) // Right(((),33))
Same, but with bindless syntax extension:
//> using scala "3.3.3"
//> using dep "io.github.marcinzh::turbolift-core:0.98.0"
//> using dep "io.github.marcinzh::turbolift-bindless:0.98.0"
import turbolift.!!
import turbolift.effects.{Reader, State, Error}
import turbolift.bindless._
@main def main =
case object MyReader extends Reader[Int]
case object MyState extends State[Int]
case object MyError extends Error[String]
val program =
`do`:
val a = MyState.get.!
val b = MyReader.ask.!
val c =
if b != 0
then a / b
else MyError.raise(s"Tried to divide $a by zero").!
MyState.put(c).!
val result =
program
.handleWith(MyState.handler(100))
.handleWith(MyReader.handler(3))
.handleWith(MyError.handler)
.run
println(result) // Right(((),33))