Tenacious.t
-- A type for "Tenacious computations".
A value tenacious
of type 'a Tenacious.t
is a recipe for cancellable computation instances, returning certified values of type 'a
.
When a tenacious
is sampled, a fresh "computation instance" begins running. The result of (an uncancelled) computation instance is a value v
paired with certificate of validity h
. The certificate is invalidated if h
breaks.
A computation instance has an associated cancel
signal, supplied when the instance was created. If an instance is cancelled, is will start no further leaf computations.
Tenacious.exec t
samples a tenacious t
, and awaits the certified result (v,h)
of the computation instance. The certificate h
may already be invalidated when the result is determined.
Tenacious.embed f
constructs a leaf
tenacious from a thunked deferred computation. A new deferred computation is created (by applying f
to a cancel
signal) each time leaf
is sampled. The deferred computation may not return None
unless leaf
is cancelled.
Tenacious.bind t1 f
construct a sequenced
tenacious, such that f
is applied to a value v1
returned by a computation instance obtained from sampling t1
. The tenacious t2 = f v1
is then sampled, with a cancel-signal incorporating the certificate h1
associated with v1
, such that t2
is cancelled if ever v1
becomes invalidated. If h1
is invalid at the time t2
has finished, sequenced
is re-sampled.
Tenacious.all children
constructs a parent
tenacious which samples its children
concurrently, and waits for them all to finish. Once a child has finished, its certificate is monitored for validity; if the certificate becomes invalid, and some siblings are still running, the invalidated child is re-sampled immediately.
Tenacious.memoize inner
constructs an outer
tenacious which behaves like inner
except a single computation instance obtained from sampling inner
is shared between every sampling of outer
. It is guaranteed only a single computation instance is ever running at the same time.
module type S = sig ... end