+ @Override
+ public void addListener(Consumer<Object> stateChanged)
+ {
+ if (wireObsPerListener.containsKey(stateChanged))
+ return;
+ AtomicReference<Object> lastStateRef = new AtomicReference<>(getHighLevelState());
+ LogicObserver obs = w ->
+ {
+ Object newState = getHighLevelState();
+ if (!Objects.equals(lastStateRef.getAndSet(newState), newState))
+ stateChanged.accept(newState);
+ };
+ wireObsPerListener.put(stateChanged, obs);
+ for (ModelWire w : wiresToForce)
+ w.addObserver(obs);
+ for (ModelWire w : wiresToForceInverted)
+ w.addObserver(obs);
+ }
+
+ @Override
+ public void removeListener(Consumer<Object> stateChanged)
+ {
+ LogicObserver obs = wireObsPerListener.remove(stateChanged);
+ if (obs == null)
+ return;
+ for (ModelWire w : wiresToForce)
+ w.removeObserver(obs);
+ for (ModelWire w : wiresToForceInverted)
+ w.removeObserver(obs);
+ }
+