50 lines
1.1 KiB
OCaml
50 lines
1.1 KiB
OCaml
open! Import
|
|
open! Option
|
|
|
|
let f = ( + )
|
|
let%test _ = [%compare.equal: int t] (merge None None ~f) None
|
|
let%test _ = [%compare.equal: int t] (merge (Some 3) None ~f) (Some 3)
|
|
let%test _ = [%compare.equal: int t] (merge None (Some 3) ~f) (Some 3)
|
|
let%test _ = [%compare.equal: int t] (merge (Some 1) (Some 3) ~f) (Some 4)
|
|
|
|
let%expect_test "[value_or_thunk]" =
|
|
let default () =
|
|
print_endline "THUNK!";
|
|
0
|
|
in
|
|
let value_or_thunk = value_or_thunk ~default in
|
|
let test t = print_s [%sexp (value_or_thunk t : int)] in
|
|
(* trigger the thunk *)
|
|
test None;
|
|
[%expect {|
|
|
THUNK!
|
|
0
|
|
|}];
|
|
(* same value, no trigger *)
|
|
test (Some 0);
|
|
[%expect {| 0 |}];
|
|
(* different value *)
|
|
test (Some 1);
|
|
[%expect {| 1 |}];
|
|
(* trigger the thunk again: no memoization *)
|
|
test None;
|
|
[%expect {|
|
|
THUNK!
|
|
0
|
|
|}]
|
|
;;
|
|
|
|
let%expect_test "map2" =
|
|
let m t1 t2 =
|
|
let result = Option.map2 ~f:(fun x y -> x + y) t1 t2 in
|
|
print_s [%sexp (result : int Option.t)]
|
|
in
|
|
m None None;
|
|
[%expect {| () |}];
|
|
m (Some 1) (Some 2);
|
|
[%expect {| (3) |}];
|
|
m None (Some 1);
|
|
[%expect {| () |}];
|
|
m (Some 1) None;
|
|
[%expect {| () |}]
|
|
;;
|