package ppx_meta_conv
Source file result.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(** 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