add conditional

This commit is contained in:
Yadunand Prem 2022-10-15 23:13:06 +08:00
parent 04f923a4ca
commit 6a4ef4ea70
4 changed files with 28 additions and 17 deletions

View File

@ -1,22 +1,25 @@
class And implements Cond {
private Cond lVal;
private Cond rVal;
public And(Cond lVal, Cond rVal) {
this.lVal = lVal;
this.rVal = rVal;
}
@Override
public boolean eval() {
return this.lVal.eval() && this.rVal.eval();
if (!this.lVal.eval()) {
return false;
}
return this.rVal.eval();
}
@Override
public String toString() {
return "(" + this.lVal + " & " + this.rVal + ")";
}
@Override
public Cond neg() {
return new Or(lVal.neg(), rVal.neg());

View File

@ -1,22 +1,23 @@
import cs2030s.fp.Constant;
import cs2030s.fp.Memo;
class Bool implements Cond {
private Boolean val;
private Memo<Boolean> val;
public Bool(Constant<Boolean> val) {
this.val = val.init();
this.val = Memo.from(val);
}
@Override
public boolean eval() {
return this.val;
return this.val.get();
}
@Override
public String toString() {
return this.val.toString().substring(0, 1);
}
@Override
public Cond neg() {
return new Not(this);

View File

@ -1,22 +1,25 @@
class Or implements Cond {
private Cond lVal;
private Cond rVal;
public Or(Cond lVal, Cond rVal) {
this.lVal = lVal;
this.rVal = rVal;
}
@Override
public boolean eval() {
return this.lVal.eval() || this.rVal.eval();
if (this.lVal.eval()) {
return true;
}
return this.rVal.eval();
}
@Override
public String toString() {
return "(" + this.lVal + " | " + this.rVal + ")";
}
@Override
public Cond neg() {
return new And(lVal.neg(), rVal.neg());

View File

@ -28,6 +28,10 @@ public class Memo<T> extends Lazy<T> {
return result;
}
public <R, S> Memo<R> combine(Memo<? extends S> other, Combiner<? extends R, ? super T, ? super S> combiner) {
return Memo.<R>from(() -> combiner.combine(this.get(), other.get()));
}
@Override
public <R> Memo<R> transform(Immutator<? extends R, ? super T> f) {
return Memo.<R>from(() -> f.invoke(this.get()));