summaryrefslogtreecommitdiff
path: root/testsuite/tests/lib-lazy/test.ml
blob: c6659f22076f6b0b715aa0019ba30127d6b56995 (plain)
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
(* TEST
   * expect
*)

(* expect-tests currently do not collect I/O,
   so we emulate I/O by collecting output in a "log" *)
let logger () =
  let log = ref [] in
  let show_log v = List.rev !log, v in
  let log v = log := v :: !log in
  log, show_log
[%%expect{|
val logger : unit -> ('a -> unit) * ('b -> 'a list * 'b) = <fun>
|}]

let _ =
  let log, show_log = logger () in
  let x = lazy (log "x"; 41) in
  let y =
    log "map";
    Lazy.map (fun n -> log "y"; n+1) x in
  log "force y";
  show_log (Lazy.force y)
;;
[%%expect{|
- : string list * int = (["map"; "force y"; "x"; "y"], 42)
|}]

let _ =
  let log, show_log = logger () in
  let x = lazy (log "x"; 41) in
  let y =
    log "map_val";
    Lazy.map_val (fun n -> log "y"; n+1) x in
  assert (not (Lazy.is_val y));
  log "force y";
  show_log (Lazy.force y)
;;
[%%expect{|
- : string list * int = (["map_val"; "force y"; "x"; "y"], 42)
|}]

let _ =
  let log, show_log = logger () in
  let x = lazy (log "x"; 41) in
  log "force x";
  let () = ignore (Lazy.force x) in
  let y =
    log "map_val";
    Lazy.map_val (fun n -> log "y"; n+1) x in
  assert (Lazy.is_val y);
  log "y is val";
  show_log (Lazy.force y)
;;
[%%expect{|
- : string list * int = (["force x"; "x"; "map_val"; "y"; "y is val"], 42)
|}]