Sha256: a527163b88dae85189777ffef72eb5cfc738a3a47ff1d0042572e68edecb47e3

Contents?: true

Size: 1.15 KB

Versions: 1

Compression:

Stored size: 1.15 KB

Contents

# encoding: utf-8

module Nanoc

  # Acts as an array, but allows fetching items using identifiers, e.g. `@items['/blah/']`.
  class ItemArray

    include Enumerable

    extend Forwardable

    DELEGATED_METHODS = Array.instance_methods + Enumerable.instance_methods - [ :[], :slice, :at, :initialize, :freeze ]
    def_delegators :@items, *DELEGATED_METHODS

    def initialize
      @items = []
    end

    def freeze
      @items.freeze
      self.build_mapping
      super
    end

    def [](*args)
      if 1 == args.size && args.first.is_a?(String)
        self.item_with_identifier(args.first)
      else
        @items[*args]
      end
    end
    alias_method :slice, :[]

    def at(arg)
      if arg.is_a?(String)
        self.item_with_identifier(arg)
      else
        @items[arg]
      end
    end

    protected

    def item_with_identifier(identifier)
      if self.frozen?
        @mapping[identifier]
      else
        @items.find { |i| i.identifier == identifier }
      end
    end

    def build_mapping
      @mapping = {}
      @items.each do |item|
        @mapping[item.identifier] = item
      end
      @mapping.freeze
    end

  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
nanoc-3.6.0 lib/nanoc/base/source_data/item_array.rb