diff --git a/core/src/main/java/org/nwapw/abacus/tree/NumberReducer.java b/core/src/main/java/org/nwapw/abacus/tree/NumberReducer.java index 5ca1ee2..fcea885 100644 --- a/core/src/main/java/org/nwapw/abacus/tree/NumberReducer.java +++ b/core/src/main/java/org/nwapw/abacus/tree/NumberReducer.java @@ -8,6 +8,7 @@ import org.nwapw.abacus.function.TreeValueOperator; import org.nwapw.abacus.number.NumberInterface; import org.nwapw.abacus.number.PromotionManager; import org.nwapw.abacus.number.PromotionResult; +import org.nwapw.abacus.variables.VariableDatabase; /** * A reducer implementation that turns a tree into a single number. @@ -35,7 +36,13 @@ public class NumberReducer implements Reducer { if (node instanceof NumberNode) { return abacus.getNumberImplementation().instanceForString(((NumberNode) node).getNumber()); } else if (node instanceof VariableNode) { - return abacus.getVariableDatabase().getVariableValue(((VariableNode) node).getVariable()); + VariableDatabase database = abacus.getVariableDatabase(); + String name = ((VariableNode) node).getVariable(); + NumberInterface variable = database.getVariables().get(name); + if(variable != null) return variable; + TreeNode definition = database.getDefinitions().get(name); + if(definition != null) return definition.reduce(this); + return abacus.getNumberImplementation().instanceForString("0"); } else if (node instanceof NumberBinaryNode) { NumberInterface left = (NumberInterface) children[0]; NumberInterface right = (NumberInterface) children[1]; diff --git a/core/src/main/kotlin/org/nwapw/abacus/variables/VariableDatabase.kt b/core/src/main/kotlin/org/nwapw/abacus/variables/VariableDatabase.kt index ab477e2..405f26a 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/variables/VariableDatabase.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/variables/VariableDatabase.kt @@ -4,7 +4,7 @@ import org.nwapw.abacus.Abacus import org.nwapw.abacus.number.NumberInterface import org.nwapw.abacus.plugin.PluginListener import org.nwapw.abacus.plugin.PluginManager -import javax.swing.tree.TreeNode +import org.nwapw.abacus.tree.TreeNode /** * A database for variables and definition. @@ -19,53 +19,11 @@ class VariableDatabase(val abacus: Abacus): PluginListener { /** * The variables that are stored in the database. */ - private val variables = mutableMapOf() + val variables = mutableMapOf() /** * The definitions that are stored in the database. */ - private val definitions = mutableMapOf() - - /** - * Stores a variable in the database. - * - * @param name the name of the variable. - * @param value the new value of the variable. - */ - fun storeVariable(name: String, value: NumberInterface) { - variables[name] = value - } - - /** - * Stores a definition in the database - * - * @param name the name of the definition. - * @param value the new value of the definition. - */ - fun storeDefinition(name: String, value: TreeNode) { - definitions[name] = value - } - - /** - * Gets the value of the variable, or 0 if - * it is not defined. - * - * @param name the name of the variable. - * @return the value of the variable. - */ - fun getVariableValue(name: String): NumberInterface { - return variables[name] ?: - abacus.numberImplementation.instanceForString("0") - } - - /** - * Gets the definition. - * - * @param name the name of the definition. - * @return the value of the definition, or null if one doesn't exist. - */ - fun getDefinition(name: String): TreeNode? { - return definitions[name] - } + val definitions = mutableMapOf() override fun onLoad(manager: PluginManager?) {