sclass OKOrError implements IF0 {
A value;
gettable Throwable error;
*() {}
*(A *value) {}
*(bool dummy, Throwable *error) {}
bool ok aka isOK() { 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); }
}