current memo and lazy impl

This commit is contained in:
Yadunand Prem
2022-10-14 17:43:38 +08:00
parent bf43015456
commit 04f923a4ca
2 changed files with 77 additions and 2 deletions

View File

@@ -2,4 +2,43 @@ package cs2030s.fp;
public class Memo<T> extends Lazy<T> {
private Actually<T> value;
protected Memo(Constant<? extends T> c) {
super(c);
// if actually is err, it is uninitialised
this.value = Actually.<T>err(null);
}
protected Memo(T v) {
super(() -> v);
this.value = Actually.ok(v);
}
public static <T> Memo<T> from(T v) {
return new Memo<T>(v);
}
public static <T> Memo<T> from(Constant<? extends T> v) {
return new Memo<T>(v);
}
public T get() {
T result = this.value.except(() -> super.get());
this.value = Actually.ok(result);
return result;
}
@Override
public <R> Memo<R> transform(Immutator<? extends R, ? super T> f) {
return Memo.<R>from(() -> f.invoke(this.get()));
}
public <R> Memo<R> next(Immutator<? extends Lazy<? extends R>, ? super T> f) {
return Memo.<R>from(() -> f.invoke(this.get()).get());
}
@Override
public String toString() {
return this.value.next(t -> Actually.ok(String.valueOf(t))).unless("?");
}
}