diff options
| author | bculkin2442 <bjculkin@mix.wvu.edu> | 2016-04-21 21:12:33 -0400 |
|---|---|---|
| committer | bculkin2442 <bjculkin@mix.wvu.edu> | 2016-04-21 21:12:33 -0400 |
| commit | e5c81a00b31a12933cf06aaeb94877dceb3ef8dd (patch) | |
| tree | 522fa18bcda621b61d41da9984c1a778cdfab687 /BJC-Utils2/src/main/java/bjc | |
| parent | b4f5f98c0aa7fc892e96771ff2df729e61c21f74 (diff) | |
Added new top-down transform type
Diffstat (limited to 'BJC-Utils2/src/main/java/bjc')
| -rw-r--r-- | BJC-Utils2/src/main/java/bjc/utils/funcdata/TopDownTransformResult.java | 6 | ||||
| -rw-r--r-- | BJC-Utils2/src/main/java/bjc/utils/funcdata/Tree.java | 35 |
2 files changed, 28 insertions, 13 deletions
diff --git a/BJC-Utils2/src/main/java/bjc/utils/funcdata/TopDownTransformResult.java b/BJC-Utils2/src/main/java/bjc/utils/funcdata/TopDownTransformResult.java index f48a90a..332c3c1 100644 --- a/BJC-Utils2/src/main/java/bjc/utils/funcdata/TopDownTransformResult.java +++ b/BJC-Utils2/src/main/java/bjc/utils/funcdata/TopDownTransformResult.java @@ -22,5 +22,9 @@ public enum TopDownTransformResult { /** * Traverse this nodes children, then transform it */ - PUSHDOWN; + PUSHDOWN, + /** + * Transform this node, then traverse its children + */ + PULLUP; } diff --git a/BJC-Utils2/src/main/java/bjc/utils/funcdata/Tree.java b/BJC-Utils2/src/main/java/bjc/utils/funcdata/Tree.java index b56ff48..4ddcd45 100644 --- a/BJC-Utils2/src/main/java/bjc/utils/funcdata/Tree.java +++ b/BJC-Utils2/src/main/java/bjc/utils/funcdata/Tree.java @@ -21,7 +21,7 @@ public class Tree<ContainedType> implements ITree<ContainedType> { private boolean hasChildren; - private int childCount = 0; + private int childCount = 0; /** * Create a new leaf node in a tree @@ -131,11 +131,11 @@ public class Tree<ContainedType> implements ITree<ContainedType> { Function<ContainedType, NewType> leafTransform, Function<ContainedType, Function<IFunctionalList<NewType>, NewType>> nodeCollapser) { if (hasChildren) { - Function<IFunctionalList<NewType>, NewType> nodeTransformer = - nodeCollapser.apply(data); + Function<IFunctionalList<NewType>, NewType> nodeTransformer = nodeCollapser + .apply(data); - IFunctionalList<NewType> collapsedChildren = - children.map((child) -> { + IFunctionalList<NewType> collapsedChildren = children + .map((child) -> { return child.collapse(leafTransform, nodeCollapser, (subTreeVal) -> subTreeVal); }); @@ -169,8 +169,8 @@ public class Tree<ContainedType> implements ITree<ContainedType> { Function<ContainedType, MappedType> leafTransformer, Function<ContainedType, MappedType> operatorTransformer) { if (hasChildren) { - IFunctionalList<ITree<MappedType>> mappedChildren = - children.map((child) -> { + IFunctionalList<ITree<MappedType>> mappedChildren = children + .map((child) -> { return child.rebuildTree(leafTransformer, operatorTransformer); }); @@ -197,8 +197,8 @@ public class Tree<ContainedType> implements ITree<ContainedType> { public ITree<ContainedType> topDownTransform( Function<ContainedType, TopDownTransformResult> transformPicker, UnaryOperator<ITree<ContainedType>> transformer) { - TopDownTransformResult transformResult = - transformPicker.apply(data); + TopDownTransformResult transformResult = transformPicker + .apply(data); switch (transformResult) { case PASSTHROUGH: @@ -227,6 +227,18 @@ public class Tree<ContainedType> implements ITree<ContainedType> { } return transformer.apply(result); + case PULLUP: + ITree<ContainedType> intermediateResult = transformer + .apply(this); + + result = new Tree<>(intermediateResult.getHead()); + + intermediateResult.doForChildren((child) -> { + result.addChild(child.topDownTransform(transformPicker, + transformer)); + }); + + return result; default: throw new IllegalArgumentException( "Recieved unknown transform result " @@ -267,9 +279,8 @@ public class Tree<ContainedType> implements ITree<ContainedType> { public <MappedType> ITree<MappedType> transformTree( Function<ContainedType, MappedType> transformer) { if (hasChildren) { - IFunctionalList<ITree<MappedType>> transformedChildren = - children.map( - (child) -> child.transformTree(transformer)); + IFunctionalList<ITree<MappedType>> transformedChildren = children + .map((child) -> child.transformTree(transformer)); return new Tree<>(transformer.apply(data), transformedChildren); |
