`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 Use_eager_deferred

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__.Deferred1.t`
`type +'a t`````
`include Core_kernel.Invariant.S1 with type a t := a t`
`type 'a t`````
`val invariant : 'a Base__.Invariant_intf.inv ‑> 'a t Base__.Invariant_intf.inv`
`include Core_kernel.Monad with type a t := a t`
`type 'a t`````
`include Base__.Monad_intf.S_without_syntax with type a t := a t`
`type 'a t`````
`include Base__.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 : Base__.Monad_intf.Infix with type a t := a t`
`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 `Pervasives.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`
`val all_ignore : unit t list ‑> unit t`

- Deprecated [since 2018-02] Use [all_unit]

`include Base__.Monad_intf.Syntax with type a t := a t`
`type 'a t`````
`module Let_syntax : sig ... end`
`module Infix : sig ... end`
`val any : 'a t list ‑> 'a t`
`val any_unit : 'a t list ‑> unit t`
`val both : 'a t ‑> 'b t ‑> ('a * 'b) t`
`val create : ('a Ivar.t ‑> unit) ‑> 'a t`
`val don't_wait_for : unit t ‑> unit`
`val ignore : _ t ‑> unit t`
`val is_determined : 'a t ‑> bool`
`val never : unit ‑> _ t`
`val ok : 'a t ‑> ('a, _) Core_kernel.Result.t t`
`val peek : 'a t ‑> 'a option`
`val unit : unit t`
`val upon : 'a t ‑> ('a ‑> unit) ‑> unit`
`val value_exn : 'a t ‑> 'a`
`val repeat_until_finished : 'state ‑> ('state ‑> [ `Repeat of 'state | `Finished of 'result ] t) ‑> 'result t`
`module List : Async_kernel__.Deferred1.Monad_sequence with type a t := a list`
`module Or_error = Async_kernel__.Eager_deferred_or_error`