let with_alt wr1 wr2 =
let fin = ref wr1.fin
in
{
cons =
(fun (a, b) ->
M.catch
(fun () -> (wr1.cons a) >>= (fun r -> M.return (None, r)))
(fun e ->
(wr2.cons b) >>=
(fun r -> (fin := wr2.fin; M.return ((Some e), r)))));
fin = (fun (_opt_err, r) -> !fin r);
}