sclass PastValueKeeper { long forgetAfter; Lock lock = lock(); L> values = synchroList(); *() {} *(double seconds) { forgetAfter = toMS(seconds); } void add(A a) { lock lock; if (nempty(values) && eq(last(values).a, a)) ret; clean(); values.add(pair(a, machineTime())); } A valueAt_orFirst(long timeBack) { lock lock; clean(); long time = machineTime()-timeBack; int i = 0; while (i < l(values) && values.get(i).b < time) ++i; ret pairA(get(values, max(i-1, 0))); } void clean { lock lock; long time = machineTime()-forgetAfter; int i = 0; while (i < l(values) && values.get(i).b < time) ++i; removeSubList(values, 0, i); } }