package openmods.utils;
import com.google.common.base.Preconditions;
import com.google.common.collect.Maps;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import openmods.Log;
public class StateTracker<T extends Enum<T>> {
public static class StateUpdater<T extends Enum<T>> {
private final String name;
private T state;
public StateUpdater(String name, T state) {
this.name = name;
this.state = state;
}
public T state() {
return state;
}
public void update(T state) {
Log.trace("State of %s updated from %s to %s", name, this.state, state);
this.state = state;
}
public String name() {
return name;
}
@Override
public String toString() {
return "[" + name + ":" + state + "]";
}
}
private final Map<String, StateUpdater<T>> states = Maps.newHashMap();
private final T defaultInitialState;
public StateTracker(T defaultInitialState) {
this.defaultInitialState = defaultInitialState;
}
public StateUpdater<T> register(String name) {
return register(name, defaultInitialState);
}
public StateUpdater<T> register(String name, T initialState) {
StateUpdater<T> state = new StateUpdater<T>(name, initialState);
StateUpdater<T> prev = states.put(name, state);
Preconditions.checkState(prev == null, "Duplicated tracked name: %s", name);
return state;
}
public Collection<StateUpdater<T>> states() {
return Collections.unmodifiableCollection(states.values());
}
public static <T extends Enum<T>> StateTracker<T> create(T initialState) {
return new StateTracker<T>(initialState);
}
}