// Either calculation result or Thread with timed-out computation // Tries to interrupt thread after timeout static Either evalWithTimeout(int timeoutMS, fO 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.waitUntilUp(timeoutMS); if (!done.isUp()) { t.interrupt(); ret either2(t); } if (error! != null) rethrow(error!); ret either1(var!); }