diff options
| author | bjculkin <bjculkin@mix.wvu.edu> | 2017-03-21 14:08:50 -0400 |
|---|---|---|
| committer | bjculkin <bjculkin@mix.wvu.edu> | 2017-03-21 14:08:50 -0400 |
| commit | a7e84eea087a35721a971e827149f0ca5fba4676 (patch) | |
| tree | fbb7b0e5e402fb2a4aae5614c51f1955640a09e8 /dice-lang/src/bjc/dicelang/v1/ast/ArithmeticCollapser.java | |
| parent | 94913a2fccff9e80f84ac477c2020bd7c7b1833a (diff) | |
Remove version 1 files
Remove the old, not used version 1 files from the repository. Check the
history if you care about them.
Diffstat (limited to 'dice-lang/src/bjc/dicelang/v1/ast/ArithmeticCollapser.java')
| -rw-r--r-- | dice-lang/src/bjc/dicelang/v1/ast/ArithmeticCollapser.java | 149 |
1 files changed, 0 insertions, 149 deletions
diff --git a/dice-lang/src/bjc/dicelang/v1/ast/ArithmeticCollapser.java b/dice-lang/src/bjc/dicelang/v1/ast/ArithmeticCollapser.java deleted file mode 100644 index 28f29f0..0000000 --- a/dice-lang/src/bjc/dicelang/v1/ast/ArithmeticCollapser.java +++ /dev/null @@ -1,149 +0,0 @@ -package bjc.dicelang.v1.ast; - -import bjc.dicelang.v1.ast.nodes.IDiceASTNode; -import bjc.dicelang.v1.ast.nodes.OperatorDiceNode; -import bjc.utils.data.IPair; -import bjc.utils.data.ITree; -import bjc.utils.data.Pair; -import bjc.utils.data.Tree; -import bjc.utils.funcdata.IList; - -import java.util.function.BinaryOperator; - -/** - * Responsible for collapsing arithmetic operators - * - * @author ben - * - */ -final class ArithmeticCollapser implements IOperatorCollapser { - // The type of operator we're collapsing - private OperatorDiceNode type; - - // The operator to use to collapse operators - private BinaryOperator<Integer> valueOp; - - private int initialValue; - - public ArithmeticCollapser(OperatorDiceNode type, BinaryOperator<Integer> valueOp, int initVal) { - this.type = type; - this.valueOp = valueOp; - this.initialValue = initVal; - } - - @Override - public IPair<IResult, ITree<IDiceASTNode>> apply(IList<IPair<IResult, ITree<IDiceASTNode>>> nodes) { - IPair<IResult, ITree<IDiceASTNode>> initialState = new Pair<>(new IntegerResult(initialValue), - new Tree<>(type)); - - BinaryOperator<IPair<IResult, ITree<IDiceASTNode>>> reducer = (currentState, accumulatedState) -> { - // Force evaluation of accumulated state to prevent - // certain bugs from occuring - // accumulatedState.merge((l, r) -> null); - - return reduceStates(accumulatedState, currentState); - }; - - IPair<IResult, ITree<IDiceASTNode>> reducedState = nodes.reduceAux(initialState, reducer, - (state) -> state); - - return reducedState; - } - - private IList<IResult> combineArrayResults(IResult accumulatedValue, IResult currentValue) { - IList<IResult> currentList = ((ArrayResult) currentValue).getValue(); - IList<IResult> accumulatedList = ((ArrayResult) accumulatedValue).getValue(); - - if(currentList.getSize() != accumulatedList.getSize()) - throw new UnsupportedOperationException("Can only apply operations to equal-length arrays"); - - IList<IResult> resultList = currentList.combineWith(accumulatedList, (currentNode, accumulatedNode) -> { - boolean currentNotInt = currentNode.getType() != ResultType.INTEGER; - boolean accumulatedNotInt = accumulatedNode.getType() != ResultType.INTEGER; - - if(currentNotInt || accumulatedNotInt) - throw new UnsupportedOperationException("Nesting of array operations isn't allowed"); - - int accumulatedInt = ((IntegerResult) accumulatedNode).getValue(); - int currentInt = ((IntegerResult) currentNode).getValue(); - - IResult combinedValue = new IntegerResult(valueOp.apply(accumulatedInt, currentInt)); - return combinedValue; - }); - return resultList; - } - - private IPair<IResult, ITree<IDiceASTNode>> doArithmeticCollapse(IResult accumulatedValue, - ITree<IDiceASTNode> accumulatedTree, IResult currentValue) { - if(accumulatedValue.getType() == ResultType.DUMMY || currentValue.getType() == ResultType.DUMMY) { - DummyResult result = new DummyResult("Found dummy result with either accumulated dummy (" - + ((DummyResult) accumulatedValue).getData() + ") or current dummy (" - + ((DummyResult) currentValue).getData() + ")."); - - return new Pair<>(result, accumulatedTree); - } - - boolean currentIsInt = currentValue.getType() == ResultType.INTEGER; - boolean accumulatedIsInt = accumulatedValue.getType() == ResultType.INTEGER; - - if(!currentIsInt) { - if(!accumulatedIsInt) { - IList<IResult> resultList = combineArrayResults(accumulatedValue, currentValue); - - return new Pair<>(new ArrayResult(resultList), accumulatedTree); - } - - IList<IResult> resultList = halfCombineLists(((ArrayResult) currentValue).getValue(), - accumulatedValue, true); - - return new Pair<>(new ArrayResult(resultList), accumulatedTree); - } else if(!accumulatedIsInt) { - IList<IResult> resultList = halfCombineLists(((ArrayResult) accumulatedValue).getValue(), - currentValue, false); - - return new Pair<>(new ArrayResult(resultList), accumulatedTree); - } - - int accumulatedInt = ((IntegerResult) accumulatedValue).getValue(); - int currentInt = ((IntegerResult) currentValue).getValue(); - - int combinedValue = valueOp.apply(accumulatedInt, currentInt); - - return new Pair<>(new IntegerResult(combinedValue), accumulatedTree); - } - - private IList<IResult> halfCombineLists(IList<IResult> list, IResult scalar, boolean scalarLeft) { - if(scalar.getType() != ResultType.INTEGER) - throw new UnsupportedOperationException("Nested array operations not supported"); - - int scalarInt = ((IntegerResult) scalar).getValue(); - - return list.map((element) -> { - if(element.getType() != ResultType.INTEGER) - throw new UnsupportedOperationException("Nested array operations not supported"); - - int elementInt = ((IntegerResult) element).getValue(); - - IResult combinedValue; - - if(scalarLeft) { - combinedValue = new IntegerResult(valueOp.apply(scalarInt, elementInt)); - } else { - combinedValue = new IntegerResult(valueOp.apply(elementInt, scalarInt)); - } - - return combinedValue; - }); - } - - private IPair<IResult, ITree<IDiceASTNode>> reduceStates(IPair<IResult, ITree<IDiceASTNode>> accumulatedState, - IPair<IResult, ITree<IDiceASTNode>> currentState) { - return accumulatedState.bind((accumulatedValue, accumulatedTree) -> { - return currentState.bind((currentValue, currentTree) -> { - accumulatedTree.addChild(currentTree); - - return doArithmeticCollapse(accumulatedValue, accumulatedTree, currentValue); - }); - }); - } -}
\ No newline at end of file |
