dcont
v0.0.0
Published
Akh delimited continuation monad and moand transformer
Downloads
16
Maintainers
Readme
DCont
Delimited continuation Akh monad transformer that layers delimited
control over a monad (dcont::trans::dcont
).
The base type, dcont::dcont
, provides delimited control on its own.
Structures
The delimited continuation transformer is a monad, functor, and applicative functor.
Running
DCont::runDCont(m, k)
Perform a delimited continuation computation m
and complete with outer continuation k
.
with
import 'akh::base' {liftM2},
import 'dcont::dcont' {runDCont of shift reset}
in {
var list = liftM2 @ \x y -> [x, y];
var c = reset \ p ->
liftM2((+),
shift @ p \k ->
list(k (of 1), k (of 2)),
shift @ p \k ->
list(k (of 10), k (of 20)));
runDCont(c, console.log); // logs: [[11, 21], [12, 22]]
}
DContT::runDContT(m, k)
Same as DContT::runDCont
but for transformed types
Delimited Control Interface
All DCont operations and methods are defined on both the type and its instances.
M.newPrompt
Create a new unique prompt that can be used to delimit a continuation.
M.pushPrompt(prompt, c)
Push prompt
on to the control stack, delimiting the continuation, and evaluate computation c
.
M.withSubCont(prompt, f)
Capture the continuation delimited by prompt
and call f
with it. f
maps the delimited continuation to a computation. The delimited control structure passed to f
should be considered opaque.
M.pushSubCont(subk, c)
Push an entire sub continuation sunk
onto the stack and evaluate computation c
.
M.reset(f)
Delimit a continuation, calling f
with delimiting prompt. f
maps the prompt to a computation that is performed inside the delimited context.
M.shift(p, f)
Capture the continuation delimited by p
, reify the continuation, and pass it to f
. f
can invoke the reified continuation with a computation to evaluate the rest of the delimited continuation, or return a computation directly to break out.