sclass RunResultWithTimestamps extends OKOrError { settable Timestamp started; settable Timestamp ended; settable CharSequence printOutput; selfType run(IF0 f, bool printStackTrace default true) { ret setPrintOutput(hijackPrint_tee(r { started(tsNow()); copyFrom(okOrError(f, printStackTrace)); ended(tsNow()); })); } bool hasRun() { ret ended != null; } // legacy OKOrError result() { this; } Duration duration() { ret ended.minusAsDuration(started); } S renderDuration() { ret formatElapsedTimeWithAppropriateUnit(nanosToSeconds(duration().toNanos())); } }