sclass OrError extends Var { O error; // usually a Throwable *() {} *(A value) { super(value); } *(bool dummy, O *error) { assertNotNull(error); } bool ok() { ret error == null; } O error() { ret error; } static OrError ok(B a) { ret new OrError(a); } static OrError error(O error) { ret new OrError(true, error); } toString { ret ok() ? super.toString() : str(error); } }