module Sof
  class HashNode < Node
    def initialize ref
      super(ref)
      @children = []
    end
    attr_reader  :children
    def add key , val
      @children << [key,val]
    end
    def out io , level = 0
      super
      indent = " " * level
      @children.each_with_index do |child , i|
        key , val = child
        io.write "\n#{indent}" unless i == 0
        io.write "-"
        key.out(io , level + 1)
        io.write " => "
        val.out(io , level + 1)
      end
    end
  end
end

Hash.class_eval do
  def to_sof_node(writer , level , ref)
    node = Sof::HashNode.new(ref)
    each do |key , object|
      k = writer.to_sof_node( key ,level + 1)
      v = writer.to_sof_node( object ,level +1)
      node.add(k , v)
    end
    node
  end
end