Sha256: a14c3dc9b495d209d5f199cea72c8bc67260145df1c24f3090eecbeac1f0abf3

Contents?: true

Size: 1.19 KB

Versions: 6

Compression:

Stored size: 1.19 KB

Contents

unless Enumerable.method_defined? :chain
  module Enumerable
    def chain(*enums)
      Enumerator::Chain.new(self, *enums)
    end
  end

  Enumerator = Enumerable::Enumerator unless Object.const_defined? :Enumerator # For 1.8.x

  class Enumerator::Chain < Enumerator
    def initialize(*enums)
      @enums = enums
      @rewindable = -1
      # This self is necessary to pass RubySpec,
      # See rubyspec/core/enumerator/chain/initialize_spec.rb
      # ...it checks what call of #initialize on non-initalized object returns
      self # rubocop:disable Lint/Void
    end

    def each(*args, &block)
      @enums.each_with_index do |enum, i|
        @rewindable = i
        enum.each(*args, &block)
      end
    end

    def size
      sum = 0
      @enums.each do |enum|
        s = enum.size
        return s if s == nil || s == Float::INFINITY
        sum += s
      end
      sum
    end

    def inspect
      detail = @enums.map(&:inspect).join(', ')
      "#<Enumerator::Chain: [#{detail}]>"
    end

    def rewind
      @rewindable.downto(0) do |i|
        enum = @enums[i]
        enum.rewind if enum.respond_to? :rewind
      end
      self
    end
  end unless Enumerator.const_defined? :Chain
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
backports-3.18.2 lib/backports/2.6.0/enumerable/chain.rb
backports-3.18.1 lib/backports/2.6.0/enumerable/chain.rb
backports-3.18.0 lib/backports/2.6.0/enumerable/chain.rb
backports-3.17.2 lib/backports/2.6.0/enumerable/chain.rb
backports-3.17.1 lib/backports/2.6.0/enumerable/chain.rb
backports-3.17.0 lib/backports/2.6.0/enumerable/chain.rb