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