Sha256: 0c9d3ee942e809106b80b51119553cce65db8b026c264cdf1aabebcc56983445

Contents?: true

Size: 1.28 KB

Versions: 2

Compression:

Stored size: 1.28 KB

Contents

module Jsus
  class Container
    include Topsortable        

    def initialize(*sources)
      sources.each do |source|
        self << source
      end
    end


    # PRO TIP: #<< sorts upon every invokation
    # #push doesn't
    def <<(source)
      push(source)
      sort!
    end

    def push(source)
      if source
        if source.kind_of?(Array) || source.kind_of?(Container)
          source.each {|s| self.push(s) }
        else
          sources.push(source)
        end
      end
      self
    end

    def flatten      
      map {|item| item.respond_to?(:flatten) ? item.flatten : item }.flatten
    end

    def to_a
      sources
    end

    def sources
      @sources ||= []
    end

    def sources=(new_value)
      @sources = new_value
    end

    def sort!
      self.sources = topsort(:sources)
      self
    end

    def inspect
      "#<#{self.class.name}:#{self.object_id} #{self.sources.inspect}>"
    end

    # delegate undefined methods to #sources
    DELEGATED_METHODS = [
                          "==", "map", "map!", "each", "inject", "reject",
                          "detect", "size", "length", "[]", "empty?",
                          "index", "include?"
                        ]
    (DELEGATED_METHODS).each {|m| delegate m, :to => :sources }
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
jsus-0.1.4 lib/jsus/container.rb
jsus-0.1.3 lib/jsus/container.rb