immutableな木を作る

immutableな木を作りたかったのでやってみた。
immutableなノードは、作った時点で自身のデータ(name)と子ノード(children)が確定している必要があるということなのであった。

import scala.collection.mutable.ArrayBuffer

class BuilderNode(val name :String) {
    val children=ArrayBuffer[BuilderNode]()
    def add(child :BuilderNode)={
        children+=(child)
        child
    }
    def result :Node={
        new Node(name, children.map{_.result}.toArray)
    }
}

class Node(val name :String, val children :Array[Node])
extends Traversable[Node] {
    override def toString="<Node %s>".format(name)
    def foreach[B](f: Node => B){
        children.foreach{
            child =>
                f(child)
                child.foreach(f)
        }
    }
}

object App {
    def main(args :Array[String]){
        val builder=new BuilderNode("root")
        val japan=builder.add(new BuilderNode("Japan"))
        japan.add(new BuilderNode("Tokyo"))
        japan.add(new BuilderNode("Kyoto"))
        val ussr=builder.add(new BuilderNode("USSR"))
        ussr.add(new BuilderNode("Moscow"))

        val root=builder.result
        root.foreach{println(_)}
    }
}