package base
Source file or_error.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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190open! Import type 'a t = ('a, Error.t) Result.t [@@deriving_inline compare, equal, hash, sexp, sexp_grammar] let compare : 'a. ('a -> 'a -> int) -> 'a t -> 'a t -> int = fun _cmp__a a__001_ b__002_ -> Result.compare _cmp__a Error.compare a__001_ b__002_ ;; let equal : 'a. ('a -> 'a -> bool) -> 'a t -> 'a t -> bool = fun _cmp__a a__007_ b__008_ -> Result.equal _cmp__a Error.equal a__007_ b__008_ ;; let hash_fold_t : 'a. (Ppx_hash_lib.Std.Hash.state -> 'a -> Ppx_hash_lib.Std.Hash.state) -> Ppx_hash_lib.Std.Hash.state -> 'a t -> Ppx_hash_lib.Std.Hash.state = fun _hash_fold_a hsv arg -> Result.hash_fold_t _hash_fold_a Error.hash_fold_t hsv arg ;; let t_of_sexp : 'a. (Sexplib0.Sexp.t -> 'a) -> Sexplib0.Sexp.t -> 'a t = fun _of_a__013_ x__015_ -> Result.t_of_sexp _of_a__013_ Error.t_of_sexp x__015_ ;; let sexp_of_t : 'a. ('a -> Sexplib0.Sexp.t) -> 'a t -> Sexplib0.Sexp.t = fun _of_a__016_ x__017_ -> Result.sexp_of_t _of_a__016_ Error.sexp_of_t x__017_ ;; let t_sexp_grammar : 'a. 'a Sexplib0.Sexp_grammar.t -> 'a t Sexplib0.Sexp_grammar.t = fun _'a_sexp_grammar -> Result.t_sexp_grammar _'a_sexp_grammar Error.t_sexp_grammar ;; [@@@end] let ( >>= ) = Result.( >>= ) let ( >>| ) = Result.( >>| ) let bind = Result.bind let ignore_m = Result.ignore_m let join = Result.join let map = Result.map let return = Result.return module Monad_infix = Result.Monad_infix let invariant invariant_a t = match t with | Ok a -> invariant_a a | Error error -> Error.invariant error ;; let map2 a b ~f = match a, b with | Ok x, Ok y -> Ok (f x y) | Ok _, (Error _ as e) | (Error _ as e), Ok _ -> e | Error e1, Error e2 -> Error (Error.of_list [ e1; e2 ]) ;; module For_applicative = Applicative.Make_using_map2_local (struct type nonrec 'a t = 'a t let return = return let map = `Custom map let map2 = map2 end) let ( *> ) = For_applicative.( *> ) let ( <* ) = For_applicative.( <* ) let ( <*> ) = For_applicative.( <*> ) let apply = For_applicative.apply let both = For_applicative.both let map3 = For_applicative.map3 module Applicative_infix = For_applicative.Applicative_infix module Let_syntax = struct let return = return include Monad_infix module Let_syntax = struct let return = return let map = map let bind = bind let both = both (* from Applicative.Make *) module Open_on_rhs = struct end end end let ok = Result.ok let is_ok = Result.is_ok let is_error = Result.is_error let try_with ?(backtrace = false) f = try Ok (f ()) with | exn -> Error (Error.of_exn exn ?backtrace:(if backtrace then Some `Get else None)) ;; let try_with_join ?backtrace f = join (try_with ?backtrace f) let ok_exn = function | Ok x -> x | Error err -> Error.raise err ;; let of_exn ?backtrace exn = Error (Error.of_exn ?backtrace exn) let of_exn_result ?backtrace = function | Ok _ as z -> z | Error exn -> of_exn ?backtrace exn ;; let error ?here ?strict message a sexp_of_a = Error (Error.create ?here ?strict message a sexp_of_a) ;; let error_s sexp = Error (Error.create_s sexp) let error_string message = Error (Error.of_string message) let errorf format = Printf.ksprintf error_string format let tag t ~tag = Result.map_error t ~f:(Error.tag ~tag) let tag_s t ~tag = Result.map_error t ~f:(Error.tag_s ~tag) let tag_s_lazy t ~tag = Result.map_error t ~f:(Error.tag_s_lazy ~tag) let tag_arg t message a sexp_of_a = Result.map_error t ~f:(fun e -> Error.tag_arg e message a sexp_of_a) ;; let unimplemented s = error "unimplemented" s sexp_of_string let combine_internal list ~on_ok ~on_error = match Result.combine_errors list with | Ok x -> Ok (on_ok x) | Error errs -> Error (on_error errs) ;; let ignore_unit_list (_ : unit list) = () let error_of_list_if_necessary = function | [ e ] -> e | list -> Error.of_list list ;; let all list = combine_internal list ~on_ok:Fn.id ~on_error:error_of_list_if_necessary let all_unit list = combine_internal list ~on_ok:ignore_unit_list ~on_error:error_of_list_if_necessary ;; let combine_errors list = combine_internal list ~on_ok:Fn.id ~on_error:Error.of_list let combine_errors_unit list = combine_internal list ~on_ok:ignore_unit_list ~on_error:Error.of_list ;; let filter_ok_at_least_one l = let ok, errs = List.partition_map l ~f:Result.to_either in match ok with | [] -> Error (Error.of_list errs) | _ -> Ok ok ;; let find_ok l = match List.find_map l ~f:Result.ok with | Some x -> Ok x | None -> Error (Error.of_list (List.map l ~f:(function | Ok _ -> assert false | Error err -> err))) ;; let find_map_ok l ~f = With_return.with_return (fun { return } -> Error (Error.of_list (List.map l ~f:(fun elt -> match f elt with | Ok _ as x -> return x | Error err -> err)))) [@nontail] ;; let map = Result.map let iter = Result.iter let iter_error = Result.iter_error