sclass WatchVariable extends Var {
ReliableSingleThread rst = new(r update_impl);
event change;
*(IF0 *f) {
update();
}
// only run in rst
void update_impl() {
A value = f?!;
if (!eq(value, get())) {
set(value);
change();
}
}
void update() {
rst!;
}
}