let list_fold_left_all func init lst =
let rec inner init lst =
match lst with
| [] -> return init
| h :: t ->
(match func init h with
| `Ok x -> inner x t
| `Error e -> `Error ((h, t, init, e)))
in inner init lst