// Either calculation result or Thread with timed-out computation static Either evalWithTimeout(int timeoutMS, O r) { final new Flag done; final new Var var; final new Var error; Thread t = startThread(r { try { var.set(callF(r)); } catch e { error.set(e); } done.raise(); }); done.wait(timeoutMS); if (!done.isUp()) ret either2(t); if (error! != null) rethrow(error!); ret either1(var!); }