Up

Module Lazy_deferred

A delayed computation that can produce a deferred.

Nothing happens with a lazy deferred unless one forces 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 to hook an asynchronous computation to a lazy value in OCaml to be triggered when the lazy gets computed. This functionality is indeed offered by this module (see wait). Plus, dealing with 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.

Signature

type 'a t
val create : (unit -> 'a Deferred.t) -> 'a t

create f creates a new lazy deferred that will call f when it is forced.

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

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
include Core_kernel.Std.Monad with type 'a t := 'a t
type 'a t
include Monad_intf.S_without_syntax with type 'a t := 'a t
type 'a t

A monad is an abstraction of the concept of sequencing of computations. A value of type 'a monad represents a computation that returns a value of type 'a.

include Monad_intf.Infix with type 'a t := 'a t
type 'a t
val (>>=) : 'a t -> ('a -> 'b t) -> 'b t

t >>= f returns a computation that sequences the computations represented by two monad elements. The resulting computation first does t to yield a value v, and then runs the computation returned by f v.

val (>>|) : 'a t -> ('a -> 'b) -> 'b t

t >>| f is t >>= (fun a -> return (f a)).

module Monad_infix : Monad_intf.Infix with type 'a t := 'a t
val bind : 'a t -> ('a -> 'b t) -> 'b t

bind t f = t >>= f

val return : 'a -> 'a t

return v returns the (trivial) computation that returns v.

val map : 'a t -> f:('a -> 'b) -> 'b t

map t ~f is t >>| f.

val join : 'a t t -> 'a t

join t is t >>= (fun t' -> t').

val ignore_m : 'a t -> unit t

ignore_m t is map t ~f:(fun _ -> ()). ignore_m used to be called ignore, but we decided that was a bad name, because it shadowed the widely used Pervasives.ignore. Some monads still do let ignore = ignore_m for historical reasons.

val all : 'a t list -> 'a list t
val all_ignore : unit t list -> unit t
include Monad_intf.Syntax with type 'a t := 'a t
type 'a t
module Let_syntax : sig .. end
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 : 'a t -> 'a Core_kernel.Std.Or_error.t option

peek t = Deferred.peek (wait t)

val peek_exn : 'a t -> 'a option
val is_determined : _ t -> bool
val is_forced : _ t -> bool