static O time(O f) { long time = sysNow(); O o = callF(f); done2_always(str(f), time); ret o; } static A time(F0 f) { ret (A) time((O) f); } static A time(IF0 f) { ret (A) time((O) f); } static A time(S msg, IF0 f) { long time = sysNow(); A o = f.get(); done2_always(msg, time); ret o; } svoid time(S msg default str(f), Runnable f) { time(msg, runnableToIF0(f)); }