Extensible, effectful DSLs
Create extensible, effectful domain specific languages while separating the effect definition from the effect implementation. Effekt is an implementation of algebraic effects with handlers and allows you to structure your effectful programs in a purely functional way. It thus represents an alternative to monad transformer based program structuring techniques or free monads.
An example
The Twitter
-API example shows how to define an effect signature with
one effectful operation userTweets
. The effect itself can be
implemented in many ways by simply implementing the abstract methods
in the Twitter
trait. It could actually contact the Twitter API
(potentially using other effects, like HTTP in the implementation) or
it could just return dummy tweets for testing purposes. We chose the
latter for the implementation of twitterStub
and thus running the
result actually perform the side-effects always gives the same results.
You can find the full sources for this example in this Dotty Scastie.
Effect signature
trait Twitter {
def userTweets(userId: Long): Control[List[Tweet]]
}
Effect usage
def query(T: Twitter): Control[List[Tweet]] =
for {
ts1 <- T.userTweets(133452)
ts2 <- T.userTweets(111345)
} yield ts1 ++ ts2
val result = twitterStub { query }
Getting Started
To use Effekt (tested with Scala 2.12 and Scala 2.13), include the
following line to your build.sbt
file:
resolvers += Opts.resolver.sonatypeSnapshots
libraryDependencies += "de.b-studios" %% "effekt" % "0.4-SNAPSHOT"
To learn how to use the library, see Your First Effect.