package dgm.trees;
import java.util.Arrays;
/**
* Combine multiple tree visitors.
*
* Visitors are combined such that if (at least) <emph>one</emph> visitor decides to abort further visit to a node,
* this composite will too.
*
*/
public class CompositeTreeVisitor<T> implements TreeVisitor<T>
{
final Iterable<TreeVisitor<T>> visitors;
public CompositeTreeVisitor(TreeVisitor<T>... visitors)
{
this(Arrays.asList(visitors));
}
public CompositeTreeVisitor(Iterable<TreeVisitor<T>> visitors)
{
this.visitors = visitors;
}
@Override
public boolean visitNode(T node, TreeViewer<T> viewer)
{
boolean state = false;
// combine using "OR" operator
for(TreeVisitor<T> v : visitors)
state |= v.visitNode(node, viewer);
return state;
}
@Override
public void beginChildren(T node, TreeViewer <T> viewer)
{
for(TreeVisitor<T> v : visitors)
v.beginChildren(node, viewer);
}
@Override
public void endChildren(T node, TreeViewer<T> viewer)
{
for(TreeVisitor<T> v : visitors)
v.endChildren(node, viewer);
}
}