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