Industrial strength, full-featured build system
Library jenga.tenacious

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
module type For_tests = sig ... end