package async_kernel

  1. Overview
  2. Docs
Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source

Source file lazy_deferred.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
open Core
open Deferred_std

module T = struct
  type 'a t =
    { start : unit Ivar.t
    ; result : 'a Or_error.t Deferred.t
    }

  let create ?(rest_exn = `Log) f =
    let start = Ivar.create () in
    { start
    ; result =
        (let%bind () = Ivar.read start in
         Monitor.try_with_or_error ~rest:rest_exn f)
    }
  ;;

  let create_or_error ?(rest_exn = `Log) f =
    let start = Ivar.create () in
    { start
    ; result =
        (let%bind () = Ivar.read start in
         Monitor.try_with_join_or_error ~rest:rest_exn f)
    }
  ;;

  let wait t = t.result
  let wait_exn t = wait t >>| ok_exn
  let start t = Ivar.fill_if_empty t.start ()

  let force t =
    start t;
    wait t
  ;;

  let force_exn t = force t >>| ok_exn
  let return a = create (fun () -> return a)

  let bind t ~f =
    create (fun () ->
      let%bind a = force_exn t in
      force_exn (f a))
  ;;

  let map t ~f = create (fun () -> force_exn t >>| f)
  let map = `Custom map
end

include T
include Monad.Make (T)

let bind' t f = bind t ~f:(fun a -> create (fun () -> f a))
let is_forced t = Ivar.is_full t.start
let is_determined t = Deferred.is_determined t.result
let peek t = Deferred.peek t.result
let peek_exn t = Option.map (peek t) ~f:ok_exn
OCaml

Innovation. Community. Security.