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()));
}
}