ONE-SHOT Algebraic Effects Library for Ruby!
require "ruff"
Double = Ruff.instance
Triple = Ruff.instance
Log = Ruff.instance
h1 = Ruff.handler
.on(Double){|k, v| k[v * 2] }
.on(Triple){|k, v| k[v * 3] }
h2 = Ruff.handler.on(Log){|k, msg|
k[]
puts "logger: #{msg}"
}
h1.run{
h2.run{
v = Double.perform 2
Log.perform (v + 2)
puts Triple.perform 3
}
}
# ==> prints
# 9
# logger: 6
You can access the delimited continuation which can run only once. Even the limitation exists, you can write powerful control flow manipulation, like async/await, call1cc.
We have an formal definition for the implementation, by showing a conversion from algebraic effects and handlers to asymmetric coroutines. See here (in Japanese).
You can define an sub effect for another effect.
It enables to make an effect hierarchy, such as Exception
s in Java.
This implementation is based on a calculus λσ<: (Description (in Japanese)).
We provide some ready-to-use effect and handlers. You can use quickly powerful control flows.
Ruff::Standard::State
Ruff::Standard::Defer
Ruff::Standard::CurrentTime
Ruff::Standard::MeasureTime
Ruff::Standard::Async
Ruff::Standard::Call1cc
MIT