sclass Schedule { Timestamp start; new TreeMultiMap entries; new TreeMap jumps; void add(double seconds, A a) { entries.put(Seconds(seconds), a); } void jumpFromTo(double from, double to) { jumps.put(Seconds(from), Seconds(to)); } void speedUp(double factor) { IF1 mod = seconds -> seconds.div(factor); entries = (TreeMultiMap) mapMultiMapKeys(mod, entries); jumps = map(mod, jumps); } run { start = tsNow(); fire(first(entries)); } void fire(Pair p) { if (p == null) ret; entries.removePair(p); sleepUntil(start.plus(p.a)); pcallF(p.b); fire(first(entries)); } }