A delayed computation that can produce a deferred.
Nothing happens with a lazy deferred unless one force
s it. Forcing a lazy deferred
starts the computation, which will eventually cause the deferred to become determined.
As usual with laziness, multiply forcing a lazy deferred is no different than forcing
it a single time.
Exceptions (both synchronous and asynchronous) raised by a delayed computation are
returned by force
(wait
, peek
, etc.), or will be raised to the monitor in effect
when force_exn
(wait_exn
, peek_exn
, etc.) was called.
The type is not exposed nor defined as 'a Deferred.t Lazy.t
or 'a Or_error.t
Deferred.t Lazy.t
, because there is a difference in power with these types. There is
no way in standard OCaml to hook an asynchronous computation to be triggered when a
lazy value gets computed. This functionality is offered by this module (see wait
).
Plus, dealing with an exception raised by the closures provided is slightly easier
when done consistently through this API.
There is no val of_lazy : 'a Deferred.t Lazy.t -> 'a t
because of the difference
in power.
val create : (unit ‑> 'a Deferred.t) ‑> 'a t
create f
creates a new lazy deferred that will call f
when it is forced.
val force : 'a t ‑> 'a Core_kernel.Or_error.t Deferred.t
force t
forces evaluation of t
and returns a deferred that becomes determined
when the deferred computation becomes determined or raises.
val force_exn : 'a t ‑> 'a Deferred.t
val wait : 'a t ‑> 'a Core_kernel.Or_error.t Deferred.t
wait t
and wait_exn t
waits for t
to be forced. If no one ever calls
force t
, they will wait forever.
val wait_exn : 'a t ‑> 'a Deferred.t
bind t f
in the lazy-deferred monad creates a computation that, when forced, will
force t
, apply f
to the result, and then force the result of that.
include Core_kernel.Monad with type a t := a t
include Base__.Monad_intf.S_without_syntax with type a t := a t
include Base__.Monad_intf.Infix with type a t := a t
module Monad_infix : Base__.Monad_intf.Infix with type a t := a t
val bind' : 'a t ‑> ('a ‑> 'b Deferred.t) ‑> 'b t
bind'
differs from bind
in that the supplied function produces an 'a Deferred.t
rather than an 'a t
.
Read-only operations.
val peek_exn : 'a t ‑> 'a option
val is_determined : _ t ‑> bool
val is_forced : _ t ‑> bool