package it.cavallium.warppi.math.parser.steps; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.functions.Subtraction; import it.cavallium.warppi.math.functions.Sum; import it.cavallium.warppi.math.functions.SumSubtraction; import it.cavallium.warppi.math.parser.MathParserStep; import it.cavallium.warppi.util.Error; import it.cavallium.warppi.util.Errors; import it.cavallium.warppi.util.IntWrapper; import it.unimi.dsi.fastutil.objects.ObjectArrayList; public class FixSumsAndSubtractions implements MathParserStep { @Override public boolean eval(final IntWrapper curIndex, final Function lastFunction, final Function currentFunction, final ObjectArrayList functionsList) throws Error { if (currentFunction instanceof Sum || currentFunction instanceof Subtraction || currentFunction instanceof SumSubtraction) { if (currentFunction.getParameter(0) == null && currentFunction.getParameter(1) == null) { if (curIndex.i - 1 >= 0 && curIndex.i + 1 < functionsList.size()) { final Function next = functionsList.get(curIndex.i + 1); final Function prev = functionsList.get(curIndex.i - 1); functionsList.set(curIndex.i, currentFunction.setParameter(0, prev).setParameter(1, next)); functionsList.remove(curIndex.i + 1); functionsList.remove(curIndex.i - 1); curIndex.i--; return true; } else if (currentFunction.getParameter(0) == null || currentFunction.getParameter(1) == null) { throw new Error(Errors.MISSING_ARGUMENTS, "There is a function at the end without any argument specified."); } } } return false; } @Override public boolean requiresReversedIteration() { return false; } @Override public String getStepName() { return "Fix Sums and Subtractions"; } }