package openmods.calc; import com.google.common.base.Preconditions; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import java.util.Map; import java.util.Set; public class OperatorDictionary<E> { private final Map<String, BinaryOperator<E>> binaryOperators = Maps.newHashMap(); private final Map<String, UnaryOperator<E>> unaryOperators = Maps.newHashMap(); private BinaryOperator<E> defaultOperator; public class BinaryOperatorRegistration<O extends BinaryOperator<E>> { private final O op; private BinaryOperatorRegistration(O op) { this.op = op; } public BinaryOperatorRegistration<O> setDefault() { Preconditions.checkState(defaultOperator == null, "Trying to replace default operator: %s -> %s", defaultOperator, op); defaultOperator = op; return this; } public O unwrap() { return op; } } public <O extends BinaryOperator<E>> BinaryOperatorRegistration<O> registerBinaryOperator(O operator) { final IExecutable<E> prev = binaryOperators.put(operator.id, operator); Preconditions.checkState(prev == null, "Duplicate operator '%s': %s -> %s", prev, operator); return new BinaryOperatorRegistration<O>(operator); } public <O extends UnaryOperator<E>> O registerUnaryOperator(O operator) { final IExecutable<E> prev = unaryOperators.put(operator.id, operator); Preconditions.checkState(prev == null, "Duplicate operator '%s': %s -> %s", prev, operator); return operator; } public BinaryOperator<E> registerDefaultOperator(BinaryOperator<E> operator) { Preconditions.checkState(defaultOperator == null, "Trying to replace default operator: %s -> %s", defaultOperator, operator); defaultOperator = operator; return operator; } public Set<String> allOperators() { return Sets.union(binaryOperators.keySet(), unaryOperators.keySet()); } public BinaryOperator<E> getBinaryOperator(String op) { return binaryOperators.get(op); } public UnaryOperator<E> getUnaryOperator(String op) { return unaryOperators.get(op); } public BinaryOperator<E> getDefaultOperator() { return defaultOperator; } }