Maven Central Version javadoc

Turbolift: Algebraic Effects for Scala 3.

Visit the microsite for description.

See also:

Project Description
DaaE Demo: a debugger implemented as an effect
Spot Cats-Effect instances for Turbolift's IO effect
Enterprise HTTP server implemented using Turbolift's effects
Beam Streams implemented with Turbolift's effects
Effect Zoo Microbenchmark suite for several effect systems, including Turbolift

Example

Runnable with scala-cli.

Important

Turbolift requires Java 11 or newer.

//> using scala "3.3.5"
//> using dep "io.github.marcinzh::turbolift-core:0.108.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.5"
//> using dep "io.github.marcinzh::turbolift-core:0.108.0"
//> using dep "io.github.marcinzh::turbolift-bindless:0.108.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))

See also examples folder. Runnable with sbt:

sbt examples/run

Usage in SBT

libraryDependencies += "io.github.marcinzh" %% "turbolift-core" % "0.108.0"

Optionally, for the bindless syntax extension:

libraryDependencies += "io.github.marcinzh" %% "turbolift-bindless" % "0.108.0"