From e5c81a00b31a12933cf06aaeb94877dceb3ef8dd Mon Sep 17 00:00:00 2001 From: bculkin2442 Date: Thu, 21 Apr 2016 21:12:33 -0400 Subject: Added new top-down transform type --- .../bjc/utils/funcdata/TopDownTransformResult.java | 6 +++- .../src/main/java/bjc/utils/funcdata/Tree.java | 35 ++++++++++++++-------- 2 files changed, 28 insertions(+), 13 deletions(-) (limited to 'BJC-Utils2/src/main/java/bjc') 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 implements ITree { 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 implements ITree { Function leafTransform, Function, NewType>> nodeCollapser) { if (hasChildren) { - Function, NewType> nodeTransformer = - nodeCollapser.apply(data); + Function, NewType> nodeTransformer = nodeCollapser + .apply(data); - IFunctionalList collapsedChildren = - children.map((child) -> { + IFunctionalList collapsedChildren = children + .map((child) -> { return child.collapse(leafTransform, nodeCollapser, (subTreeVal) -> subTreeVal); }); @@ -169,8 +169,8 @@ public class Tree implements ITree { Function leafTransformer, Function operatorTransformer) { if (hasChildren) { - IFunctionalList> mappedChildren = - children.map((child) -> { + IFunctionalList> mappedChildren = children + .map((child) -> { return child.rebuildTree(leafTransformer, operatorTransformer); }); @@ -197,8 +197,8 @@ public class Tree implements ITree { public ITree topDownTransform( Function transformPicker, UnaryOperator> transformer) { - TopDownTransformResult transformResult = - transformPicker.apply(data); + TopDownTransformResult transformResult = transformPicker + .apply(data); switch (transformResult) { case PASSTHROUGH: @@ -227,6 +227,18 @@ public class Tree implements ITree { } return transformer.apply(result); + case PULLUP: + ITree 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 implements ITree { public ITree transformTree( Function transformer) { if (hasChildren) { - IFunctionalList> transformedChildren = - children.map( - (child) -> child.transformTree(transformer)); + IFunctionalList> transformedChildren = children + .map((child) -> child.transformTree(transformer)); return new Tree<>(transformer.apply(data), transformedChildren); -- cgit v1.2.3