package me.august.lumen.compile.analyze.node;
import me.august.lumen.compile.parser.ast.expr.Expression;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
public class SimpleNode<T> {
private List<SimpleNode<T>> children;
private T data;
public SimpleNode(T data) {
this.data = data;
this.children = new ArrayList<>();
}
public SimpleNode(T data, List<SimpleNode<T>> children) {
this.data = data;
this.children = children;
}
public static <T> SimpleNode<T> createNode(Expression expr, Function<Expression, T> dataProducer) {
SimpleNode<T> node = new SimpleNode<>(dataProducer.apply(expr));
if (expr != null && expr.getChildren() != null && expr.getChildren().length > 0) {
for (Expression child : expr.getChildren()) {
node.children.add(createNode(child, dataProducer));
}
}
return node;
}
public List<SimpleNode<T>> getChildren() {
return children;
}
public T getData() {
return data;
}
public void visitTopDown(Consumer<SimpleNode<T>> visitor) {
visitor.accept(this);
for (SimpleNode<T> child : children) {
child.visitTopDown(visitor);
}
}
public void visitBottomUp(Consumer<SimpleNode<T>> visitor) {
for (SimpleNode<T> child : children) {
child.visitBottomUp(visitor);
}
visitor.accept(this);
}
}