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);
        }