sclass OKOrError implements IF0 {
A value;
gettable Throwable error;
*() {}
*(A *value) {}
*(bool dummy, Throwable *error) { assertNotNull(error); }
bool ok aka isOK() { ret error == null; }
bool isError() { ret error != null; }
toString {
ret ok()
? /*"OK: " +*/ str(value)
: "Error: " + str(error);
}
public A get() { ret !ok() ? null : value; }
public A getMandatory() { if (!ok()) throw rethrow(error); ret value; }
static OKOrError ok(A a) { ret new OKOrError(a); }
static OKOrError error(Throwable error) { ret new OKOrError(false, error); }
void setValue(A value) {
this.value = value;
error = null;
}
void setError(Throwable error) {
this.value = null;
this.error = error;
}
void copyFrom(OKOrError x) {
value = x.value;
error = x.error;
}
}