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.7"
//> using dep "io.github.marcinzh::turbolift-core:0.126.0"
import turbolift.!!
import turbolift.effects.{ReaderEffect, StateEffect, ErrorEffect}

@main def main =
  // 👉 Definitions of custom effect instances:
  case object MyReader extends ReaderEffect[Int]
  case object MyState extends StateEffect[Int]
  case object MyError extends ErrorEffect[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 (async/await alike):

//> using scala "3.3.7"
//> using dep "io.github.marcinzh::turbolift-core:0.126.0"
//> using dep "io.github.marcinzh::turbolift-bindless:0.126.0"
import turbolift.!!
import turbolift.effects.{ReaderEffect, StateEffect, ErrorEffect}
import turbolift.bindless._

@main def main =
  // 👉 Definitions of custom effect instances:
  case object MyReader extends ReaderEffect[Int]
  case object MyState extends StateEffect[Int]
  case object MyError extends ErrorEffect[String]

  val program =
    `do`:
      val a = State.get[Int].!
      val b = Reader.ask[Int].!
      val c =
        if b != 0
        then a / b
        else Error.raise(s"Tried to divide $a by zero").!
      State.put(c).!

  val result =
    program
    .handleWith(State.handler(100))
    .handleWith(Reader.handler(3))
    .handleWith(Error.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.126.0"

Optionally, for the bindless syntax extension:

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