From 7c12fd8fe169944152ca73f0da4e8fe8e280f648 Mon Sep 17 00:00:00 2001 From: bculkin2442 Date: Mon, 18 Apr 2016 08:38:24 -0400 Subject: Added new option to top-down travers --- .../src/main/java/bjc/utils/funcdata/ITree.java | 20 ++++++++++++++++++++ .../bjc/utils/funcdata/TopDownTransformResult.java | 6 +++++- .../src/main/java/bjc/utils/funcdata/Tree.java | 21 ++++++++++++++++++++- 3 files changed, 45 insertions(+), 2 deletions(-) (limited to 'BJC-Utils2/src') diff --git a/BJC-Utils2/src/main/java/bjc/utils/funcdata/ITree.java b/BJC-Utils2/src/main/java/bjc/utils/funcdata/ITree.java index 7f28682..bbcefd3 100644 --- a/BJC-Utils2/src/main/java/bjc/utils/funcdata/ITree.java +++ b/BJC-Utils2/src/main/java/bjc/utils/funcdata/ITree.java @@ -155,4 +155,24 @@ public interface ITree { public ITree topDownTransform( Function transformPicker, UnaryOperator> transformer); + + /** + * Get the specified child of this tree + * + * @param childNo + * The number of the child to get + * @return The specified child of this tree + */ + default ITree getChild(int childNo) { + return transformChild(childNo, (child) -> child); + } + + /** + * Get the data stored in this node + * + * @return The data stored in this node + */ + default ContainedType getHead() { + return transformHead((head) -> head); + } } 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 9aec2b9..f48a90a 100644 --- a/BJC-Utils2/src/main/java/bjc/utils/funcdata/TopDownTransformResult.java +++ b/BJC-Utils2/src/main/java/bjc/utils/funcdata/TopDownTransformResult.java @@ -18,5 +18,9 @@ public enum TopDownTransformResult { /** * Ignore this node, and traverse its children */ - PASSTHROUGH; + PASSTHROUGH, + /** + * Traverse this nodes children, then transform it + */ + PUSHDOWN; } 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 03a1f93..cd43df7 100644 --- a/BJC-Utils2/src/main/java/bjc/utils/funcdata/Tree.java +++ b/BJC-Utils2/src/main/java/bjc/utils/funcdata/Tree.java @@ -60,7 +60,15 @@ public class Tree implements ITree { } } - private Tree(ContainedType leafToken, + /** + * Create a new tree node with the specified children + * + * @param leafToken + * The data to hold in this node + * @param childrn + * A list of children for this node + */ + public Tree(ContainedType leafToken, IFunctionalList> childrn) { data = leafToken; @@ -286,6 +294,17 @@ public class Tree implements ITree { return this; case TRANSFORM: return transformer.apply(this); + case PUSHDOWN: + result = new Tree<>(data); + + if (hasChildren) { + children.forEach((child) -> { + result.addChild(child.topDownTransform( + transformPicker, transformer)); + }); + } + + return transformer.apply(result); default: throw new IllegalArgumentException( "Recieved unknown transform result " -- cgit v1.2.3