Sha256: 487ac3dc01e84f4963c93f291918584d0bc995503e7753577a4d3bf52c84688e

Contents?: true

Size: 1.83 KB

Versions: 6

Compression:

Stored size: 1.83 KB

Contents

# coding: utf-8

require 'i18n/tasks/data/tree/traversal'
module I18n::Tasks::Data::Tree
  # A list of nodes
  class Nodes
    include Enumerable
    include Traversal

    attr_reader :list

    def initialize(opts = {})
      @list = opts[:nodes] ? opts[:nodes].to_a.clone : []
    end

    delegate :each, :present?, :empty?, :blank?, :size, :to_a, to: :@list

    def to_nodes
      self
    end

    def attributes
      {nodes: @list}
    end

    def derive(new_attr = {})
      attr = attributes.except(:nodes, :parent).merge(new_attr)
      node_attr = new_attr.slice(:parent)
      attr[:nodes] ||= @list.map { |node| node.derive(node_attr) }
      self.class.new(attr)
    end

    def to_hash(sort = false)
      (@hash ||= {})[sort] ||= begin
        if sort
          self.sort { |a, b| a.key <=> b.key }
        else
          self
        end.map { |node| node.to_hash(sort) }.reduce({}, :deep_merge!)
      end
    end

    delegate :to_json, to: :to_hash
    delegate :to_yaml, to: :to_hash

    def inspect
      if present?
        map(&:inspect) * "\n"
      else
        Term::ANSIColor.dark '{∅}'
      end
    end

    # methods below change state

    def remove!(node)
      @list.delete(node) or raise "#{node.full_key} not found in #{self.inspect}"
      dirty!
      self
    end

    def append!(other)
      @list += other.to_a
      dirty!
      self
    end

    def append(other)
      derive.append!(other)
    end

    alias << append

    def merge!(nodes)
      @list += nodes.to_a
      dirty!
      self
    end
    alias + merge!

    def children(&block)
      return to_enum(:children) { map { |c| c.children.size }.reduce(:+) } unless block
      each do |node|
        node.children.each(&block) if node.children?
      end
    end

    alias children? any?

    protected
    def dirty!
      @hash = nil
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
i18n-tasks-0.8.5 lib/i18n/tasks/data/tree/nodes.rb
i18n-tasks-0.8.4 lib/i18n/tasks/data/tree/nodes.rb
i18n-tasks-0.8.3 lib/i18n/tasks/data/tree/nodes.rb
i18n-tasks-0.8.2 lib/i18n/tasks/data/tree/nodes.rb
i18n-tasks-0.8.1 lib/i18n/tasks/data/tree/nodes.rb
i18n-tasks-0.8.0 lib/i18n/tasks/data/tree/nodes.rb