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; } }