package sudoku.structure; import java.util.HashMap; import java.util.Map; import java.util.Stack; //TODO: doc public class StateManager { private final Stack> states; private final MultiDoku doku; public StateManager(MultiDoku doku) { this.states = new Stack<>(); this.doku = doku; } public Map pushState() { states.add(saveState()); return states.getLast(); } public void popState() { assert (states.size() > 0); restoreState(states.pop()); } public Map popAndGetState() { assert (states.size() > 0); var currentState = saveState(); restoreState(states.pop()); return currentState; } private void restoreState(Map state) { for (var entry : state.entrySet()) { entry.getKey().setSymbolIndex(entry.getValue()); } } private Map saveState() { Map state = new HashMap<>(); for (Cell cell : this.doku.getCells()) { state.put(cell, cell.getSymbolIndex()); } return state; } }