mirror of
https://github.com/DanilaFe/abacus
synced 2024-12-22 07:20:09 -08:00
Format code.
This commit is contained in:
parent
e172108476
commit
6a65e66935
|
@ -1,9 +1,7 @@
|
|||
package org.nwapw.abacus;
|
||||
|
||||
import org.nwapw.abacus.config.Configuration;
|
||||
import org.nwapw.abacus.number.NaiveNumber;
|
||||
import org.nwapw.abacus.number.NumberInterface;
|
||||
import org.nwapw.abacus.number.PreciseNumber;
|
||||
import org.nwapw.abacus.number.PromotionManager;
|
||||
import org.nwapw.abacus.parsing.LexerTokenizer;
|
||||
import org.nwapw.abacus.parsing.ShuntingYardParser;
|
||||
|
@ -14,8 +12,6 @@ import org.nwapw.abacus.plugin.StandardPlugin;
|
|||
import org.nwapw.abacus.tree.NumberReducer;
|
||||
import org.nwapw.abacus.tree.TreeNode;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* The main calculator class. This is responsible
|
||||
* for piecing together all of the components, allowing
|
||||
|
@ -72,6 +68,7 @@ public class Abacus {
|
|||
|
||||
/**
|
||||
* Gets the promotion manager.
|
||||
*
|
||||
* @return the promotion manager.
|
||||
*/
|
||||
public PromotionManager getPromotionManager() {
|
||||
|
@ -139,12 +136,13 @@ public class Abacus {
|
|||
|
||||
/**
|
||||
* Gets the number implementation.
|
||||
*
|
||||
* @return the number implementation to use for creating numbers.
|
||||
*/
|
||||
public NumberImplementation getNumberImplementation(){
|
||||
public NumberImplementation getNumberImplementation() {
|
||||
NumberImplementation selectedImplementation =
|
||||
pluginManager.numberImplementationFor(configuration.getNumberImplementation());
|
||||
if(selectedImplementation != null) return selectedImplementation;
|
||||
if (selectedImplementation != null) return selectedImplementation;
|
||||
return DEFAULT_IMPLEMENTATION;
|
||||
}
|
||||
|
||||
|
|
|
@ -50,13 +50,13 @@ public class LexerTokenizer implements Tokenizer<Match<TokenType>>, PluginListen
|
|||
for (String operator : manager.getAllOperators()) {
|
||||
lexer.register(Pattern.sanitize(operator), TokenType.OP);
|
||||
}
|
||||
for (String operator : manager.getAllTreeValueOperators()){
|
||||
for (String operator : manager.getAllTreeValueOperators()) {
|
||||
lexer.register(Pattern.sanitize(operator), TokenType.TREE_VALUE_OP);
|
||||
}
|
||||
for (String function : manager.getAllFunctions()) {
|
||||
lexer.register(Pattern.sanitize(function), TokenType.FUNCTION);
|
||||
}
|
||||
for (String function : manager.getAllTreeValueFunctions()){
|
||||
for (String function : manager.getAllTreeValueFunctions()) {
|
||||
lexer.register(Pattern.sanitize(function), TokenType.TREE_VALUE_FUNCTION);
|
||||
}
|
||||
}
|
||||
|
@ -66,13 +66,13 @@ public class LexerTokenizer implements Tokenizer<Match<TokenType>>, PluginListen
|
|||
for (String operator : manager.getAllOperators()) {
|
||||
lexer.unregister(Pattern.sanitize(operator), TokenType.OP);
|
||||
}
|
||||
for (String operator : manager.getAllTreeValueOperators()){
|
||||
for (String operator : manager.getAllTreeValueOperators()) {
|
||||
lexer.unregister(Pattern.sanitize(operator), TokenType.TREE_VALUE_OP);
|
||||
}
|
||||
for (String function : manager.getAllFunctions()) {
|
||||
lexer.unregister(Pattern.sanitize(function), TokenType.FUNCTION);
|
||||
}
|
||||
for (String function : manager.getAllTreeValueFunctions()){
|
||||
for (String function : manager.getAllTreeValueFunctions()) {
|
||||
lexer.unregister(Pattern.sanitize(function), TokenType.TREE_VALUE_FUNCTION);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -134,7 +134,7 @@ public class ShuntingYardParser implements Parser<Match<TokenType>>, PluginListe
|
|||
TreeNode right = constructRecursive(matches);
|
||||
TreeNode left = constructRecursive(matches);
|
||||
if (left == null || right == null) return null;
|
||||
if(matchType == TokenType.OP) {
|
||||
if (matchType == TokenType.OP) {
|
||||
return new NumberBinaryNode(operator, left, right);
|
||||
} else {
|
||||
return new TreeValueBinaryNode(operator, left, right);
|
||||
|
@ -142,7 +142,7 @@ public class ShuntingYardParser implements Parser<Match<TokenType>>, PluginListe
|
|||
} else {
|
||||
TreeNode applyTo = constructRecursive(matches);
|
||||
if (applyTo == null) return null;
|
||||
if(matchType == TokenType.OP){
|
||||
if (matchType == TokenType.OP) {
|
||||
return new NumberUnaryNode(operator, applyTo);
|
||||
} else {
|
||||
return new TreeValueUnaryNode(operator, applyTo);
|
||||
|
@ -155,7 +155,7 @@ public class ShuntingYardParser implements Parser<Match<TokenType>>, PluginListe
|
|||
} else if (matchType == TokenType.FUNCTION || matchType == TokenType.TREE_VALUE_FUNCTION) {
|
||||
String functionName = match.getContent();
|
||||
CallNode node;
|
||||
if(matchType == TokenType.FUNCTION){
|
||||
if (matchType == TokenType.FUNCTION) {
|
||||
node = new FunctionNode(functionName);
|
||||
} else {
|
||||
node = new TreeValueFunctionNode(functionName);
|
||||
|
|
|
@ -241,7 +241,7 @@ public class PluginManager {
|
|||
* @param name the class for which to find the implementation name.
|
||||
* @return the implementation name.
|
||||
*/
|
||||
public String interfaceImplementationNameFor(Class<? extends NumberInterface> name){
|
||||
public String interfaceImplementationNameFor(Class<? extends NumberInterface> name) {
|
||||
return interfaceImplementationNames.get(name);
|
||||
}
|
||||
|
||||
|
|
|
@ -7,7 +7,6 @@ import org.nwapw.abacus.number.PreciseNumber;
|
|||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.function.BiFunction;
|
||||
|
||||
/**
|
||||
* The plugin providing standard functions such as addition and subtraction to
|
||||
|
@ -24,7 +23,7 @@ public class StandardPlugin extends Plugin {
|
|||
return params.length == 2;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public NumberInterface applyInternal(NumberImplementation implementation, NumberInterface[] params) {
|
||||
return params[0].add(params[1]);
|
||||
|
@ -39,7 +38,7 @@ public class StandardPlugin extends Plugin {
|
|||
return params.length == 2;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public NumberInterface applyInternal(NumberImplementation implementation, NumberInterface[] params) {
|
||||
return params[0].subtract(params[1]);
|
||||
|
@ -55,7 +54,7 @@ public class StandardPlugin extends Plugin {
|
|||
return params.length == 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public NumberInterface applyInternal(NumberImplementation implementation, NumberInterface[] params) {
|
||||
return params[0].negate();
|
||||
|
@ -70,7 +69,7 @@ public class StandardPlugin extends Plugin {
|
|||
return params.length == 2;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public NumberInterface applyInternal(NumberImplementation implementation, NumberInterface[] params) {
|
||||
return params[0].multiply(params[1]);
|
||||
|
@ -90,21 +89,6 @@ public class StandardPlugin extends Plugin {
|
|||
return new NaiveNumber(Math.PI);
|
||||
}
|
||||
};
|
||||
/**
|
||||
* The square root function.
|
||||
*/
|
||||
public static final NumberFunction FUNCTION_SQRT = new NumberFunction() {
|
||||
@Override
|
||||
public boolean matchesParams(NumberImplementation implementation, NumberInterface[] params) {
|
||||
return params.length == 1;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public NumberInterface applyInternal(NumberImplementation implementation, NumberInterface[] params) {
|
||||
return OP_CARET.apply(implementation, params[0], implementation.instanceForString(".5"));
|
||||
}
|
||||
};
|
||||
/**
|
||||
* The implementation for the infinite-precision BigDecimal.
|
||||
*/
|
||||
|
@ -147,10 +131,10 @@ public class StandardPlugin extends Plugin {
|
|||
public static final NumberOperator OP_DIVIDE = new NumberOperator(OperatorAssociativity.LEFT, OperatorType.BINARY_INFIX, 1) {
|
||||
@Override
|
||||
public boolean matchesParams(NumberImplementation implementation, NumberInterface[] params) {
|
||||
return params.length == 2 && params[1].compareTo(implementation.instanceForString(Integer.toString( 0))) != 0;
|
||||
return params.length == 2 && params[1].compareTo(implementation.instanceForString(Integer.toString(0))) != 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public NumberInterface applyInternal(NumberImplementation implementation, NumberInterface[] params) {
|
||||
return params[0].divide(params[1]);
|
||||
|
@ -168,7 +152,7 @@ public class StandardPlugin extends Plugin {
|
|||
&& params[0].signum() >= 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public NumberInterface applyInternal(NumberImplementation implementation, NumberInterface[] params) {
|
||||
if (params[0].signum() == 0) {
|
||||
|
@ -199,7 +183,7 @@ public class StandardPlugin extends Plugin {
|
|||
&& params[1].fractionalPart().signum() == 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public NumberInterface applyInternal(NumberImplementation implementation, NumberInterface[] params) {
|
||||
if (params[0].compareTo(params[1]) < 0 ||
|
||||
|
@ -230,7 +214,7 @@ public class StandardPlugin extends Plugin {
|
|||
&& params[1].fractionalPart().signum() == 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public NumberInterface applyInternal(NumberImplementation implementation, NumberInterface[] params) {
|
||||
return OP_NPR.apply(implementation, params).divide(OP_FACTORIAL.apply(implementation, params[1]));
|
||||
|
@ -245,7 +229,7 @@ public class StandardPlugin extends Plugin {
|
|||
return params.length == 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public NumberInterface applyInternal(NumberImplementation implementation, NumberInterface[] params) {
|
||||
return params[0].multiply(implementation.instanceForString(Integer.toString(params[0].signum())));
|
||||
|
@ -260,7 +244,7 @@ public class StandardPlugin extends Plugin {
|
|||
return params.length == 1 && params[0].compareTo(implementation.instanceForString("0")) > 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public NumberInterface applyInternal(NumberImplementation implementation, NumberInterface[] params) {
|
||||
NumberInterface param = params[0];
|
||||
|
@ -341,12 +325,58 @@ public class StandardPlugin extends Plugin {
|
|||
return params.length == 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public NumberInterface applyInternal(NumberImplementation implementation, NumberInterface[] params) {
|
||||
return implementation.instanceForString(Long.toString(Math.round(Math.random() * params[0].floor().intValue())));
|
||||
}
|
||||
};
|
||||
/**
|
||||
* The caret / pow operator, ^
|
||||
*/
|
||||
public static final NumberOperator OP_CARET = new NumberOperator(OperatorAssociativity.RIGHT, OperatorType.BINARY_INFIX, 2) {
|
||||
@Override
|
||||
public boolean matchesParams(NumberImplementation implementation, NumberInterface[] params) {
|
||||
NumberInterface zero = implementation.instanceForString("0");
|
||||
return params.length == 2
|
||||
&& !(params[0].compareTo(zero) == 0
|
||||
&& params[1].compareTo(zero) == 0)
|
||||
&& !(params[0].signum() == -1 && params[1].fractionalPart().compareTo(zero) != 0);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public NumberInterface applyInternal(NumberImplementation implementation, NumberInterface[] params) {
|
||||
NumberInterface zero = implementation.instanceForString("0");
|
||||
if (params[0].compareTo(zero) == 0)
|
||||
return zero;
|
||||
else if (params[1].compareTo(zero) == 0)
|
||||
return implementation.instanceForString("1");
|
||||
//Detect integer bases:
|
||||
if (params[0].fractionalPart().compareTo(implementation.instanceForString("0")) == 0
|
||||
&& FUNCTION_ABS.apply(implementation, params[1]).compareTo(implementation.instanceForString(Integer.toString(Integer.MAX_VALUE))) < 0
|
||||
&& FUNCTION_ABS.apply(implementation, params[1]).compareTo(implementation.instanceForString("1")) >= 0) {
|
||||
NumberInterface[] newParams = {params[0], params[1].fractionalPart()};
|
||||
return params[0].intPow(params[1].floor().intValue()).multiply(applyInternal(implementation, newParams));
|
||||
}
|
||||
return FUNCTION_EXP.apply(implementation, FUNCTION_LN.apply(implementation, FUNCTION_ABS.apply(implementation, params[0])).multiply(params[1]));
|
||||
}
|
||||
};
|
||||
/**
|
||||
* The square root function.
|
||||
*/
|
||||
public static final NumberFunction FUNCTION_SQRT = new NumberFunction() {
|
||||
@Override
|
||||
public boolean matchesParams(NumberImplementation implementation, NumberInterface[] params) {
|
||||
return params.length == 1;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public NumberInterface applyInternal(NumberImplementation implementation, NumberInterface[] params) {
|
||||
return OP_CARET.apply(implementation, params[0], implementation.instanceForString(".5"));
|
||||
}
|
||||
};
|
||||
private static final HashMap<NumberImplementation, ArrayList<NumberInterface>> FACTORIAL_LISTS = new HashMap<>();
|
||||
/**
|
||||
* The exponential function, exp(1) = e^1 = 2.71...
|
||||
|
@ -357,7 +387,7 @@ public class StandardPlugin extends Plugin {
|
|||
return params.length == 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public NumberInterface applyInternal(NumberImplementation implementation, NumberInterface[] params) {
|
||||
NumberInterface maxError = params[0].getMaxError();
|
||||
|
@ -386,37 +416,6 @@ public class StandardPlugin extends Plugin {
|
|||
}
|
||||
}
|
||||
};
|
||||
/**
|
||||
* The caret / pow operator, ^
|
||||
*/
|
||||
public static final NumberOperator OP_CARET = new NumberOperator(OperatorAssociativity.RIGHT, OperatorType.BINARY_INFIX, 2) {
|
||||
@Override
|
||||
public boolean matchesParams(NumberImplementation implementation, NumberInterface[] params) {
|
||||
NumberInterface zero = implementation.instanceForString("0");
|
||||
return params.length == 2
|
||||
&& !(params[0].compareTo(zero) == 0
|
||||
&& params[1].compareTo(zero) == 0)
|
||||
&& !(params[0].signum() == -1 && params[1].fractionalPart().compareTo(zero) != 0);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public NumberInterface applyInternal(NumberImplementation implementation, NumberInterface[] params) {
|
||||
NumberInterface zero = implementation.instanceForString("0");
|
||||
if (params[0].compareTo(zero) == 0)
|
||||
return zero;
|
||||
else if (params[1].compareTo(zero) == 0)
|
||||
return implementation.instanceForString("1");
|
||||
//Detect integer bases:
|
||||
if (params[0].fractionalPart().compareTo(implementation.instanceForString("0")) == 0
|
||||
&& FUNCTION_ABS.apply(implementation, params[1]).compareTo(implementation.instanceForString(Integer.toString(Integer.MAX_VALUE))) < 0
|
||||
&& FUNCTION_ABS.apply(implementation, params[1]).compareTo(implementation.instanceForString("1")) >= 0) {
|
||||
NumberInterface[] newParams = {params[0], params[1].fractionalPart()};
|
||||
return params[0].intPow(params[1].floor().intValue()).multiply(applyInternal(implementation, newParams));
|
||||
}
|
||||
return FUNCTION_EXP.apply(implementation, FUNCTION_LN.apply(implementation, FUNCTION_ABS.apply(implementation, params[0])).multiply(params[1]));
|
||||
}
|
||||
};
|
||||
/**
|
||||
* The sine function (the argument is interpreted in radians).
|
||||
*/
|
||||
|
@ -426,7 +425,7 @@ public class StandardPlugin extends Plugin {
|
|||
return params.length == 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public NumberInterface applyInternal(NumberImplementation implementation, NumberInterface[] params) {
|
||||
NumberInterface pi = piFor(params[0].getClass());
|
||||
|
@ -451,7 +450,7 @@ public class StandardPlugin extends Plugin {
|
|||
return params.length == 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public NumberInterface applyInternal(NumberImplementation implementation, NumberInterface[] params) {
|
||||
return functionSin.apply(implementation, piFor(params[0].getClass()).divide(implementation.instanceForString("2"))
|
||||
|
@ -467,7 +466,7 @@ public class StandardPlugin extends Plugin {
|
|||
return params.length == 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public NumberInterface applyInternal(NumberImplementation implementation, NumberInterface[] params) {
|
||||
return functionSin.apply(implementation, params[0]).divide(functionCos.apply(implementation, params[0]));
|
||||
|
@ -482,7 +481,7 @@ public class StandardPlugin extends Plugin {
|
|||
return params.length == 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public NumberInterface applyInternal(NumberImplementation implementation, NumberInterface[] params) {
|
||||
return implementation.instanceForString("1").divide(functionCos.apply(implementation, params[0]));
|
||||
|
@ -497,7 +496,7 @@ public class StandardPlugin extends Plugin {
|
|||
return params.length == 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public NumberInterface applyInternal(NumberImplementation implementation, NumberInterface[] params) {
|
||||
return implementation.instanceForString("1").divide(functionSin.apply(implementation, params[0]));
|
||||
|
@ -512,7 +511,7 @@ public class StandardPlugin extends Plugin {
|
|||
return params.length == 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public NumberInterface applyInternal(NumberImplementation implementation, NumberInterface[] params) {
|
||||
return functionCos.apply(implementation, params[0]).divide(functionSin.apply(implementation, params[0]));
|
||||
|
@ -529,7 +528,7 @@ public class StandardPlugin extends Plugin {
|
|||
&& FUNCTION_ABS.apply(implementation, params[0]).compareTo(implementation.instanceForString("1")) <= 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public NumberInterface applyInternal(NumberImplementation implementation, NumberInterface[] params) {
|
||||
if (FUNCTION_ABS.apply(implementation, params[0]).compareTo(implementation.instanceForString(".8")) >= 0) {
|
||||
|
@ -544,9 +543,9 @@ public class StandardPlugin extends Plugin {
|
|||
while (FUNCTION_ABS.apply(implementation, currentTerm).compareTo(summandBound) > 0) {
|
||||
exponent += 2;
|
||||
power = power.multiply(multiplier);
|
||||
coefficient = coefficient.multiply(implementation.instanceForString(Integer.toString( exponent - 2)))
|
||||
.divide(implementation.instanceForString(Integer.toString( exponent - 1)));
|
||||
currentTerm = power.multiply(coefficient).divide(implementation.instanceForString(Integer.toString( exponent)));
|
||||
coefficient = coefficient.multiply(implementation.instanceForString(Integer.toString(exponent - 2)))
|
||||
.divide(implementation.instanceForString(Integer.toString(exponent - 1)));
|
||||
currentTerm = power.multiply(coefficient).divide(implementation.instanceForString(Integer.toString(exponent)));
|
||||
sum = sum.add(currentTerm);
|
||||
}
|
||||
return sum;
|
||||
|
@ -562,7 +561,7 @@ public class StandardPlugin extends Plugin {
|
|||
return params.length == 1 && FUNCTION_ABS.apply(implementation, params[0]).compareTo(implementation.instanceForString("1")) <= 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public NumberInterface applyInternal(NumberImplementation implementation, NumberInterface[] params) {
|
||||
return piFor(params[0].getClass()).divide(implementation.instanceForString("2"))
|
||||
|
@ -579,7 +578,7 @@ public class StandardPlugin extends Plugin {
|
|||
return params.length == 1 && FUNCTION_ABS.apply(implementation, params[0]).compareTo(implementation.instanceForString("1")) >= 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public NumberInterface applyInternal(NumberImplementation implementation, NumberInterface[] params) {
|
||||
NumberInterface[] reciprocalParamArr = {implementation.instanceForString("1").divide(params[0])};
|
||||
|
@ -596,7 +595,7 @@ public class StandardPlugin extends Plugin {
|
|||
return params.length == 1 && FUNCTION_ABS.apply(implementation, params[0]).compareTo(implementation.instanceForString("1")) >= 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public NumberInterface applyInternal(NumberImplementation implementation, NumberInterface[] params) {
|
||||
NumberInterface[] reciprocalParamArr = {implementation.instanceForString("1").divide(params[0])};
|
||||
|
@ -639,7 +638,7 @@ public class StandardPlugin extends Plugin {
|
|||
while (FUNCTION_ABS.apply(implementation, currentTerm).compareTo(maxError) > 0) {
|
||||
n += 2;
|
||||
currentPower = currentPower.multiply(multiplier);
|
||||
currentTerm = currentPower.divide(implementation.instanceForString(Integer.toString( n)));
|
||||
currentTerm = currentPower.divide(implementation.instanceForString(Integer.toString(n)));
|
||||
sum = sum.add(currentTerm);
|
||||
}
|
||||
return sum;
|
||||
|
@ -671,7 +670,7 @@ public class StandardPlugin extends Plugin {
|
|||
* computes factorials of non-negative integers.
|
||||
*
|
||||
* @param implementation type of number to return.
|
||||
* @param n non-negative integer.
|
||||
* @param n non-negative integer.
|
||||
* @return a number of numClass with value n factorial.
|
||||
*/
|
||||
public static NumberInterface factorial(NumberImplementation implementation, int n) {
|
||||
|
@ -684,7 +683,7 @@ public class StandardPlugin extends Plugin {
|
|||
ArrayList<NumberInterface> list = FACTORIAL_LISTS.get(implementation);
|
||||
if (n >= list.size()) {
|
||||
while (list.size() < n + 16) {
|
||||
list.add(list.get(list.size() - 1).multiply(implementation.instanceForString(Integer.toString( list.size()))));
|
||||
list.add(list.get(list.size() - 1).multiply(implementation.instanceForString(Integer.toString(list.size()))));
|
||||
}
|
||||
}
|
||||
return list.get(n);
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
package org.nwapw.abacus.tree;
|
||||
|
||||
import org.nwapw.abacus.Abacus;
|
||||
import org.nwapw.abacus.function.*;
|
||||
import org.nwapw.abacus.function.NumberFunction;
|
||||
import org.nwapw.abacus.function.NumberOperator;
|
||||
import org.nwapw.abacus.function.TreeValueFunction;
|
||||
import org.nwapw.abacus.function.TreeValueOperator;
|
||||
import org.nwapw.abacus.number.NumberInterface;
|
||||
import org.nwapw.abacus.number.PromotionManager;
|
||||
import org.nwapw.abacus.number.PromotionResult;
|
||||
|
@ -31,14 +34,14 @@ public class NumberReducer implements Reducer<NumberInterface> {
|
|||
PromotionManager manager = abacus.getPromotionManager();
|
||||
if (node instanceof NumberNode) {
|
||||
return abacus.getNumberImplementation().instanceForString(((NumberNode) node).getNumber());
|
||||
} else if(node instanceof VariableNode) {
|
||||
} else if (node instanceof VariableNode) {
|
||||
return abacus.getNumberImplementation().instanceForString("0");
|
||||
} else if (node instanceof NumberBinaryNode) {
|
||||
NumberInterface left = (NumberInterface) children[0];
|
||||
NumberInterface right = (NumberInterface) children[1];
|
||||
NumberOperator operator = abacus.getPluginManager().operatorFor(((BinaryNode) node).getOperation());
|
||||
PromotionResult result = manager.promote(left, right);
|
||||
if(result == null) return null;
|
||||
if (result == null) return null;
|
||||
return operator.apply(result.getPromotedTo(), result.getItems());
|
||||
} else if (node instanceof NumberUnaryNode) {
|
||||
NumberInterface child = (NumberInterface) children[0];
|
||||
|
@ -52,29 +55,29 @@ public class NumberReducer implements Reducer<NumberInterface> {
|
|||
NumberFunction function = abacus.getPluginManager().functionFor(((FunctionNode) node).getCallTo());
|
||||
if (function == null) return null;
|
||||
PromotionResult result = manager.promote(convertedChildren);
|
||||
if(result == null) return null;
|
||||
if (result == null) return null;
|
||||
return function.apply(result.getPromotedTo(), result.getItems());
|
||||
} else if (node instanceof TreeValueFunctionNode){
|
||||
} else if (node instanceof TreeValueFunctionNode) {
|
||||
CallNode callNode = (CallNode) node;
|
||||
TreeNode[] realChildren = new TreeNode[callNode.getChildren().size()];
|
||||
for(int i = 0; i < realChildren.length; i++){
|
||||
for (int i = 0; i < realChildren.length; i++) {
|
||||
realChildren[i] = callNode.getChildren().get(i);
|
||||
}
|
||||
TreeValueFunction function =
|
||||
abacus.getPluginManager().treeValueFunctionFor(callNode.getCallTo());
|
||||
if(function == null) return null;
|
||||
if (function == null) return null;
|
||||
return function.applyWithReducer(abacus.getNumberImplementation(), this, realChildren);
|
||||
} else if (node instanceof TreeValueBinaryNode) {
|
||||
BinaryNode binaryNode = (BinaryNode) node;
|
||||
TreeValueOperator operator = abacus.getPluginManager()
|
||||
.treeValueOperatorFor(binaryNode.getOperation());
|
||||
if(operator == null) return null;
|
||||
if (operator == null) return null;
|
||||
return operator.applyWithReducer(abacus.getNumberImplementation(), this, binaryNode.getLeft(), binaryNode.getRight());
|
||||
} else if(node instanceof TreeValueUnaryNode) {
|
||||
} else if (node instanceof TreeValueUnaryNode) {
|
||||
UnaryNode unaryNode = (UnaryNode) node;
|
||||
TreeValueOperator operator = abacus.getPluginManager()
|
||||
.treeValueOperatorFor(unaryNode.getOperation());
|
||||
if(operator == null) return null;
|
||||
if (operator == null) return null;
|
||||
return operator.applyWithReducer(abacus.getNumberImplementation(), this, unaryNode.getApplyTo());
|
||||
}
|
||||
return null;
|
||||
|
|
Loading…
Reference in New Issue
Block a user