import cs2030s.fp.Immutator; import cs2030s.fp.Saveable; Immutator, Integer> f = x -> Saveable.of(x).map(y -> y + 1).map(y -> y + 10); Saveable zero = Saveable.of(0) zero.flatMap1(f) zero.flatMap1(f).flatMap1(f) zero.flatMap1(f).undo() zero.flatMap1(f).undo().undo() zero.flatMap1(f).flatMap1(f).undo() zero.flatMap1(f).flatMap1(f).undo().undo() zero.flatMap1(f).flatMap1(f).undo().undo().undo() zero.flatMap2(f) zero.flatMap2(f).flatMap2(f) zero.flatMap2(f).undo() zero.flatMap2(f).undo().undo() zero.flatMap2(f).flatMap2(f).undo() zero.flatMap2(f).flatMap2(f).undo().undo() zero.flatMap2(f).flatMap2(f).undo().undo().undo() Immutator, Object> hash = o -> Saveable.of(o.hashCode() + 10); Saveable.of(4).flatMap1(hash); // should compile Saveable.of(4).flatMap2(hash); // should compile