package org.zwobble.couscous.ast.structure; import org.zwobble.couscous.ast.Node; import org.zwobble.couscous.util.ExtraIterables; import java.util.function.Predicate; import java.util.stream.Stream; public class NodeStructure { public static Stream descendantNodesAndSelf(Node node, Predicate predicate) { return Stream.concat(Stream.of(node), descendantNodes(node, predicate)); } public static Stream descendantNodes(Node node, Predicate predicate) { return childNodes(node) .filter(predicate) .flatMap(child -> descendantNodesAndSelf(child, predicate)); } public static Stream descendantNodesAndSelf(Node node) { return Stream.concat(Stream.of(node), descendantNodes(node)); } public static Stream descendantNodes(Node node) { return childNodes(node).flatMap(NodeStructure::descendantNodesAndSelf); } public static Stream childNodes(Node node) { return ExtraIterables.stream(node.childNodes()); } }