2025-09-15 23:41:36 +02:00
|
|
|
let ( let* ) o f = match o with Ok v -> f v | Error _ as e -> e
|
|
|
|
|
let ( let+ ) o f = match o with Ok v -> Ok (f v) | Error _ as e -> e
|
|
|
|
|
|
2026-03-03 10:31:57 +01:00
|
|
|
(* TODO better errors
|
|
|
|
|
use polymorphic variant for errors
|
|
|
|
|
use GANA error codes:
|
|
|
|
|
https://git.gnunet.org/gana.git/tree/gnu-taler-error-codes/registry.rec *)
|
2026-03-03 10:48:14 +01:00
|
|
|
let unwrap_msg o = match o with Error (`Msg e) -> Error e | Ok v -> Ok v
|
2025-10-17 15:25:10 +02:00
|
|
|
|
2025-12-07 01:02:54 +01:00
|
|
|
let unwrap_err_caqti o =
|
|
|
|
|
match o with Error err -> Fmt.error "%a" Caqti_error.pp err | Ok v -> Ok v
|
|
|
|
|
|
2025-09-15 23:41:36 +02:00
|
|
|
let list_iter f l =
|
|
|
|
|
let err = ref None in
|
|
|
|
|
try
|
|
|
|
|
List.iter
|
|
|
|
|
(fun v ->
|
|
|
|
|
match f v with
|
|
|
|
|
| Error _e as e ->
|
|
|
|
|
err := Some e;
|
|
|
|
|
raise Exit
|
|
|
|
|
| Ok () -> ())
|
|
|
|
|
l;
|
|
|
|
|
Ok ()
|
|
|
|
|
with Exit -> ( match !err with None -> assert false | Some v -> v)
|
|
|
|
|
|
|
|
|
|
let list_map f l =
|
|
|
|
|
let err = ref None in
|
|
|
|
|
try
|
|
|
|
|
Ok
|
|
|
|
|
(List.map
|
|
|
|
|
(fun v ->
|
|
|
|
|
match f v with
|
|
|
|
|
| Error _e as e ->
|
|
|
|
|
err := Some e;
|
|
|
|
|
raise Exit
|
|
|
|
|
| Ok v -> v)
|
|
|
|
|
l)
|
|
|
|
|
with Exit -> ( match !err with None -> assert false | Some v -> v)
|
|
|
|
|
|
2026-02-23 11:45:27 +01:00
|
|
|
let list_filter_map f l =
|
|
|
|
|
let err = ref None in
|
|
|
|
|
try
|
|
|
|
|
Ok
|
|
|
|
|
(List.filter_map
|
|
|
|
|
(fun v ->
|
|
|
|
|
match f v with
|
|
|
|
|
| Error _e as e ->
|
|
|
|
|
err := Some e;
|
|
|
|
|
raise Exit
|
|
|
|
|
| Ok v -> v)
|
|
|
|
|
l)
|
|
|
|
|
with Exit -> ( match !err with None -> assert false | Some v -> v)
|
|
|
|
|
|
2025-09-15 23:41:36 +02:00
|
|
|
let list_fold_left f acc l =
|
|
|
|
|
List.fold_left
|
|
|
|
|
(fun acc v ->
|
|
|
|
|
let* acc = acc in
|
|
|
|
|
f acc v)
|
|
|
|
|
(Ok acc) l
|