package dev.isxander.yacl3.impl; import dev.isxander.yacl3.api.Binding; import dev.isxander.yacl3.api.StateManager; public class SimpleStateManager implements StateManager, ProvidesBindingForDeprecation { private T pendingValue; private final Binding binding; private StateListener stateListener; public SimpleStateManager(Binding binding) { this.binding = binding; this.pendingValue = binding.getValue(); this.stateListener = StateListener.noop(); } @Override public void set(T value) { boolean changed = !this.pendingValue.equals(value); this.pendingValue = value; if (changed) stateListener.onStateChange(this.pendingValue, value); } @Override public T get() { return pendingValue; } @Override public void apply() { binding.setValue(pendingValue); } @Override public void resetToDefault(ResetAction action) { this.set(binding.defaultValue()); } @Override public void sync() { this.set(binding.getValue()); } @Override public boolean isSynced() { return binding.getValue().equals(pendingValue); } @Override public boolean isDefault() { return binding.defaultValue().equals(pendingValue); } @Override public void addListener(StateListener stateListener) { this.stateListener = this.stateListener.andThen(stateListener); } @Override public Binding getBinding() { return binding; } }