package items.requirements; import items.Item; import items.Recipe; import java.util.HashMap; import java.util.Map; public abstract class Accumulator implements RequirementAccumulator{ protected Map inputs; public Accumulator(Map inputs) { this.inputs = inputs; } protected abstract E calculate(Item i, E subAmount, E amount, Map total); protected abstract E dequeue(Item item, E amount, Map totals); @Override public Map accumulate() { Map total = new HashMap<>(); Map queue = new HashMap<>(); for (Item i : inputs.keySet()) { queue.put(i, inputs.get(i)); } while (!queue.isEmpty()) { Item i = queue.keySet().iterator().next(); E amount = queue.remove(i); E newTotal = dequeue(i, amount, total); total.put(i,newTotal); if (i.getRecipes().isEmpty()) { continue; } Recipe r = i.getRecipes().iterator().next(); Map subRequirements = getRequirements(r, i); for (Item subItem : subRequirements.keySet()) { E subAmount = subRequirements.get(subItem); E newSubTotal = calculate(subItem, subAmount, amount, total); total.put(subItem, newSubTotal); } } return total; } protected abstract Map getRequirements(Recipe r, Item i);// r.getTotalRequirements() }