Eager_deferred partially implements the Deferred interface, with a type 'a t equal to 'a Deferred.t, but where the operations are "eager", that is built upon a world where bind, map, and upon eagerly apply their closure without preemption in the case the deferred they are working with is already determined.
The goal with that approach is that one can locally write the following to switch to such a world.
open Eager_deferred.Use We do not intend at first for this to implement the entire Deferred interface, because some of this will require more experimentation and discussions. We can proceed incrementally to enrich this interface.
test/test_eager_deferred verifies that this interface is a sub interface of the Deferred interface. For documentation, refer to Deferred .
include sig ... end with type 'a t := 'a Async_kernel.Deferred.t type +'a tinclude Core_kernel.Monad with type 'a t := 'a t type 'a tinclude Base__.Monad_intf.S_without_syntax with type 'a t := 'a t type 'a tinclude Base__.Monad_intf.Infix with type 'a t := 'a t type 'a tval (>>=) : '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)).
val bind : 'a t -> f:('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 Caml.ignore. Some monads still do let ignore = ignore_m for historical reasons.
val all : 'a t list -> 'a list t val all_unit : unit t list -> unit t Like all, but ensures that every monadic value in the list produces a unit value, all of which are discarded rather than being collected into a list.
val all_ignore : unit t list -> unit t module Infix : sig ... end val any : 'a t list -> 'a t val any_unit : unit t list -> unit t val both : 'a t -> 'b t -> ('a * 'b ) t val create : ('a Async_kernel.Ivar.t -> unit) -> 'a t val don't_wait_for : unit t -> unitval ignore : _ t -> unit t val is_determined : 'a t -> boolval never : unit -> _ t val ok : 'a t -> ('a , _ ) Core_kernel.Result.t t val peek : 'a t -> 'a optionval unit : unit t val upon : 'a t -> ('a -> unit) -> unitval value_exn : 'a t -> 'a val repeat_until_finished : 'state -> ('state -> [ `Repeat of 'state | `Finished of 'result ] t ) -> 'result t