Sha256: 17fb133663bff3691a67a14645c82ddf5cd43e8ab90e9aacacd719f91722479b

Contents?: true

Size: 1.84 KB

Versions: 2

Compression:

Stored size: 1.84 KB

Contents

# Collection holds most of the logic, for now.
# It has all the nodes, can iterate over them, and can even save to a file!
class SGF::Collection
  include Enumerable, Observable

  attr_accessor :current_node, :errors, :gametrees
  attr_reader :root

  def initialize(root = SGF::Node.new)
    @root = root
    @current_node = @root
    @root.add_observer(self)
    @errors = []
    @gametrees = @root.children.map do |root_of_tree|
      SGF::Gametree.new(root_of_tree)
    end
  end

  def each
    gametrees.each do |game|
      game.each do |node|
        yield node
      end
    end
  end

  def <<(gametree)
    unless gametree.instance_of?(SGF::Gametree)
      raise ArgumentError, "Expected instance of class SGF::Gametree but was instance of #{gametree.class}"
    end
    @root.add_children gametree.root
  end

  # Compares a tree to another tree, node by node.
  # Nodes must be the same (same properties, parents and children).
  def == other
    self.map { |node| node } == other.map { |node| node }
  end

  def inspect
    out = "#<SGF::Collection:#{self.object_id}, "
    out << "#{gametrees.count} Games, "
    out << "#{node_count} Nodes"
    out << ">"
  end

  def to_s
    SGF::Writer.new.stringify_tree_from @root
  end

  # Saves the Collection as an SGF file. Takes a filename as argument.
  def save filename
    SGF::Writer.new.save(@root, filename)
  end

  def update(message, data)
    case message
      when :new_children
        data.each do |new_gametree_root|
          @gametrees << SGF::Gametree.new(new_gametree_root)
        end
    end
  end

  private

  def node_count
    gametrees.inject(0) { |sum, game| sum + game.count }
  end

  def method_missing method_name, *args
    super(method_name, args) if @root.children.empty? || !@root.children[0].properties.has_key?(method_name)
    @root.children[0].properties[method_name]
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
SgfParser-3.0.1 lib/sgf/collection.rb
SgfParser-3.0.0 lib/sgf/collection.rb