package cs2030s.fp; public class Lazy implements Immutatorable { private Constant init; protected Lazy(Constant c) { this.init = c; } public T get() { return init.init(); } public static Lazy from(T v) { return new Lazy<>(() -> v); } public static Lazy from(Constant v) { return new Lazy(v); } @Override public Lazy transform(Immutator f) { return Lazy.from(() -> f.invoke(this.get())); } public Lazy next(Immutator, ? super T> f) { return Lazy.from(() -> f.invoke(this.get()).get()); } @Override public String toString() { return this.init.init().toString(); } }