let (foldres_of_fold :
     (('-> '-> 'a) -> '-> '-> 'a) ->
       ('-> '-> ('a, 'e) res) -> '-> '-> ('a, 'e) res) =
  fun fold f init v ->
    let opt_err = ref None in
    let new_f a v =
      match f a v with
      | `Ok new_a -> new_a
      | `Error e -> (opt_err := Some e; raise Foldres_exit)
    in
      try `Ok (fold new_f init v)
      with
      | Foldres_exit ->
          (match !opt_err with | None -> assert false | Some e -> `Error e)