package containers

  1. Overview
  2. Docs

Futures for concurrency

type 'a state =
  1. | Done of 'a
  2. | Waiting
  3. | Failed of exn
type 'a t

A future value of type 'a

type 'a future = 'a t

Constructors

val return : 'a -> 'a t

Future that is already computed

val fail : exn -> 'a t

Future that fails immediately

val make : (unit -> 'a) -> 'a t

Create a future, representing a value that will be computed by the function. If the function raises, the future will fail.

val make1 : ('a -> 'b) -> 'a -> 'b t
val make2 : ('a -> 'b -> 'c) -> 'a -> 'b -> 'c t

Basics

val get : 'a t -> 'a

Blocking get: wait for the future to be evaluated, and get the value, or the exception that failed the future is returned.

  • raises e

    if the exception failed with e

val state : 'a t -> 'a state

State of the future

val is_done : 'a t -> bool

Is the future evaluated (success/failure)?

Combinators

val on_success : 'a t -> ('a -> unit) -> unit

Attach a handler to be called upon success

val on_failure : _ t -> (exn -> unit) -> unit

Attach a handler to be called upon failure

val on_finish : 'a t -> ('a state -> unit) -> unit

Attach a handler to be called when the future is evaluated

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

Monadic combination of futures

val and_then : 'a t -> (unit -> 'b t) -> 'b t

Wait for the first future to succeed, then launch the second

val sequence : 'a t list -> 'a list t

Future that waits for all previous sequences to terminate. If any future in the list fails, sequence l fails too.

val choose : 'a t list -> 'a t

Choose among those futures (the first to terminate). Behaves like the first future that terminates, by failing if the future fails

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

Maps the value inside the future. The function doesn't run in its own task; if it can take time, use flat_map

Helpers

val read_chan : Pervasives.in_channel -> Bytes.t t

Read the whole channel

type subprocess_res = < errcode : int ; stdout : Bytes.t ; stderr : Bytes.t >
val spawn_process : ?stdin:string -> string -> subprocess_res t

Spawn a sub-process with the given command (and possibly input); returns a future containing (returncode, stdout, stderr)

val sleep : float -> unit t

Future that returns with success in the given amount of seconds. Blocks the thread! If you need to wait on many events, consider using Timer

Event timer

module Timer : sig ... end
module Infix : sig ... end
val (>>=) : 'a t -> ('a -> 'b t) -> 'b t
val (>>) : 'a t -> (unit -> 'b t) -> 'b t
val (>|=) : 'a t -> ('a -> 'b) -> 'b t

Low level

val stop_pool : unit -> unit

Stop the thread pool

OCaml

Innovation. Community. Security.