Warning: session_start(): open(/var/lib/php/sessions/sess_4lj7opukmgkmc6m0e8v1mvtcfv, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
!7
sclass Calculation {
O f;
Calculation deferredTo;
OKOrError result;
*() {}
*(O *f) {}
void calc() {
if (done()) ret;
try {
result = OKOrError_ok(callF(f));
} catch e {
Throwable inner = getInnerException(e);
if (inner instanceof DeferCalculation)
deferredTo = inner/DeferCalculation.calculation();
else
result = OKOrError_error(e);
}
}
bool done() { ret result != null || deferredTo != null; }
toString {
S s = "Calculation of " + f + ".";
if (deferredTo != null) s += " Deferred to: " + deferredTo;
else if (result != null) s += " " + result;
else s += " Not run";
ret s;
}
Calculation resolve() {
Calculation c = this;
while (c.deferredTo != null) c = c.deferredTo;
ret c;
}
}
p {
Calculation c = new Calculation(f now);
print(c);
c.calc();
print(c);
c = new Calculation(f fail);
c.calc();
print(c);
c = new Calculation(r { throw DeferCalculation(Calculation(f now)) });
print(c);
c.calc();
print(c);
c = c.resolve();
c.calc();
print(c);
}