let with_alt with1 with2 (a, b) f' = let ok1 = ref false in try with1 a (fun r1 -> let () = ok1 := true in f' (None, r1)) with | e1 -> if !ok1 then raise e1 else with2 b (fun r2 -> f' ((Some e1), r2))