sclass WaitForStableValue { long period; A value; long valueSince; *() {} *(long *period) {} *(double seconds) { period = toMS(seconds); } synchronized A set(A a) { if (neq(a, value)) { value = a; valueSince = sysNow(); } ret get(); } synchronized A get() { ret valueSince != 0 && sysNow() >= valueSince+period ? value : null; } // clears only if result != null synchronized A setAndClear(A _a) { A a = set(_a); if (a != null) clear(); ret a; } public bool has() { ret get() != null; } void clear() { set(null); } }