/* Binary Tree Traversal Framework Applications Test (Generic Version)
   Applications of the various second-level frameworks
   H. Conrad Cunningham
   Version #1: 29 April 2010

123456789012345678901234567890123456789012345678901234567890123456789012345678
*/


/* Parenthesized traversal strategy for Euler Tour Traversal Framework */

class VisitParen[Val] extends EulerStrategy[Val,String] {
  def visitLeft(ts: String, t: BinTree[Val])    = ts + "("
  def visitBottom(ts: String, t: BinTree[Val])  = ts + t.getValue
  def visitRight(ts: String, t: BinTree[Val])   = ts + ")" 
  def visitNilTree(ts: String, t: BinTree[Val]) = ts + "(NIL)"
}


/* This concrete BreadthFirstStrategy appends the values onto a String. */

class Appender[Val] extends BreadthFirstVisitStrategy[Val,String] {
  def visitNode(ts: String, t: BinTree[Val])     = ts + "|" + t
  def visitNilTree (ts: String, t: BinTree[Val]) = ts
}


/*  Toward a test program.  Minimal testing so far.  */

object BinTreeTest {

  def main(args: Array[String]) {   
    val vs = new VisitParen[String]
    val v  = new EulerTourVisitor(vs,"START>")
    val nilTree = new NilTree[String]

    println("Euler parenthesized traversal")
    println("Input is NilTree")
    nilTree.accept(v)
    println(v.getResult)
    println(" ")

    v.reinitResult
    val t = new Node("1",new Node("2",nilTree,new Node("3",nilTree,nilTree)),
	                 new Node("4",nilTree,nilTree) ) 
    println("Input is " + t)
    t.accept(v)
    println(v.getResult)
    println(" ")

    println("Breadth first traversal -- appender");
    val bfs = new Appender[String]
    val bfv = new BreadthFirstVisitor(bfs,"")
    t.accept(bfv);
    println(bfv.getResult)

    println("Mapping Visitor -- allstars");
    val mv = new MappingVisitor((s:String) => "*")
    t.accept(mv)
    println("Result is: " + t)
    v.setResult("")
    t.accept(v)
    println(v.getResult)
  }
}
