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
(** Result monad *)
type ('a, 'error) t = ('a, 'error) result
let bind t f = match t with
| Ok v -> f v
| Error err -> Error err
let (>>=) = bind
let fmap f t = match t with
| Ok v -> Ok (f v)
| Error err -> Error err
let (>>|) t f = fmap f t
let map dec ts =
let rec map st = function
| [] -> Ok (List.rev st)
| t::ts ->
match dec t with
| Ok h -> map (h::st) ts
| Error err -> Error err
in
map [] ts
let mapi dec ts =
let rec map st n = function
| [] -> Ok (List.rev st)
| t::ts ->
match dec n t with
| Ok h -> map (h::st) (n+1) ts
| Error err -> Error err
in
map [] 0 ts
let fail e = Error e
let catch f =
let module Error = struct exception Error end in
let error = ref None in
let fail e = error := Some e; raise Error.Error in
try Ok (f ~fail) with
| Error.Error ->
match !error with
| Some e -> Error e
| None -> assert false
let catch_exn f = catch (fun ~fail -> try f () with e -> fail e)
let result okf errf = function
| Ok v -> okf v
| Error e -> errf e
module Open = struct
let (>>=) = (>>=)
let (>>|) = (>>|)
end