package dgm.trees;
import java.util.*;
/** Build a tree by visiting it
*/
public class TreeBuilder<A> implements TreeVisitor<A>
{
final Deque<List<Tree<A>>> trees = new LinkedList<List<Tree<A>>>();
Tree<A> root = null;
@Override
public boolean visitNode(A node, TreeViewer<A> viewer)
{
return false;
}
@Override
public void beginChildren(A node, TreeViewer<A> viewer)
{
trees.addFirst(new ArrayList<Tree<A>>());
}
@Override
public void endChildren(A node, TreeViewer<A> viewer)
{
final List<Tree<A>> children = trees.removeFirst();
final Tree<A> tree = new ImmutableTree<A>(node, children);
// we have not reached the top of the queue
final List<Tree<A>> parent = trees.peekFirst();
if(parent != null)
{
parent.add(tree);
return;
}
// we finished visiting, store the root
root = tree;
}
public Tree<A> tree()
{
return root;
}
}