let list_map_all func lst =
let rec inner rev_acc lst =
match lst with
| [] -> return & (List.rev rev_acc)
| h :: t ->
(match func h with
| `Ok x -> inner (x :: rev_acc) t
| `Error e -> `Error ((h, e)))
in inner [] lst