diff --git a/src/main/java/net/kemitix/node/Node.java b/src/main/java/net/kemitix/node/Node.java index 6477681..4a0e67a 100644 --- a/src/main/java/net/kemitix/node/Node.java +++ b/src/main/java/net/kemitix/node/Node.java @@ -249,5 +249,12 @@ public interface Node { * * @return a stream of all the nodes in the tree below this node */ - Stream> streamAll(); + Stream> stream(); + + /** + * Returns a stream of all the node's ancestor nodes. + * + * @return a stream of the node's parents recursively until the root node + */ + Stream> parentStream(); } diff --git a/src/main/java/net/kemitix/node/NodeItem.java b/src/main/java/net/kemitix/node/NodeItem.java index 70724c5..d876c8f 100644 --- a/src/main/java/net/kemitix/node/NodeItem.java +++ b/src/main/java/net/kemitix/node/NodeItem.java @@ -371,8 +371,14 @@ class NodeItem implements Node { } @Override - public Stream> streamAll() { + public Stream> stream() { return Stream.concat(Stream.of(this), getChildren().stream() - .flatMap(Node::streamAll)); + .flatMap(Node::stream)); + } + + @Override + public Stream> parentStream() { + return findParent().map(node -> Stream.concat(Stream.of(node), node.parentStream())) + .orElseGet(Stream::empty); } } diff --git a/src/test/java/net/kemitix/node/ImmutableNodeItemTest.java b/src/test/java/net/kemitix/node/ImmutableNodeItemTest.java index 6f5491d..7454e05 100644 --- a/src/test/java/net/kemitix/node/ImmutableNodeItemTest.java +++ b/src/test/java/net/kemitix/node/ImmutableNodeItemTest.java @@ -437,14 +437,14 @@ public class ImmutableNodeItemTest { Nodes.namedChild("eight", "eight", n6); val immutableRoot = Nodes.asImmutable(node); //when - val result = immutableRoot.streamAll() + val result = immutableRoot.stream() .collect(Collectors.toList()); //then assertThat(result).as("full tree") .hasSize(9); // and assertThat(immutableRoot.getChild("one") - .streamAll() + .stream() .collect(Collectors.toList())).as("sub-tree") .hasSize(4); } diff --git a/src/test/java/net/kemitix/node/NodeItemTest.java b/src/test/java/net/kemitix/node/NodeItemTest.java index 9e8504c..e9928b6 100644 --- a/src/test/java/net/kemitix/node/NodeItemTest.java +++ b/src/test/java/net/kemitix/node/NodeItemTest.java @@ -920,13 +920,13 @@ public class NodeItemTest { val n7 = Nodes.namedChild("seven", "seven", n5); val n8 = Nodes.namedChild("eight", "eight", n6); //when - val result = node.streamAll() + val result = node.stream() .collect(Collectors.toList()); //then assertThat(result).as("full tree") .contains(node, n1, n2, n3, n4, n5, n6, n7, n8); // and - assertThat(n1.streamAll() + assertThat(n1.stream() .collect(Collectors.toList())).as("sub-tree") .containsExactlyInAnyOrder(n1, n3, n5, n7); } @@ -945,4 +945,24 @@ public class NodeItemTest { assertThat(Nodes.unnamedChild(null, root) .isRoot()).isFalse(); } + + @Test + public void parentStream() { + //given + val root = Nodes.namedRoot("root data", "root"); + val child1 = Nodes.namedChild("child 1 data", "child 1", root); + val child2 = Nodes.namedChild("child 2 data", "child 2", root); + val child3 = Nodes.namedChild("child 3 data", "child 3", child2); + //when + val resultRoot = root.parentStream() + .collect(Collectors.toSet()); + val resultChild1 = child1.parentStream() + .collect(Collectors.toSet()); + val resultChild3 = child3.parentStream() + .collect(Collectors.toSet()); + //then + assertThat(resultRoot).isEmpty(); + assertThat(resultChild1).containsExactlyInAnyOrder(root); + assertThat(resultChild3).containsExactlyInAnyOrder(child2, root); + } }