Class: SyncEnumerator

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/rubysl/generator/generator.rb

Overview

SyncEnumerator creates an Enumerable object from multiple Enumerable objects and enumerates them synchronously.

Example

require 'generator'

s = SyncEnumerator.new([1,2,3], ['a', 'b', 'c'])

# Yields [1, 'a'], [2, 'b'], and [3,'c']
s.each { |row| puts row.join(', ') }

Instance Method Summary collapse

Constructor Details

#initialize(*enums) ⇒ SyncEnumerator

Creates a new SyncEnumerator which enumerates rows of given Enumerable objects.



190
191
192
# File 'lib/rubysl/generator/generator.rb', line 190

def initialize(*enums)
  @gens = enums.map { |e| Generator.new(e) }
end

Instance Method Details

#eachObject

Enumerates rows of the Enumerable objects.



218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
# File 'lib/rubysl/generator/generator.rb', line 218

def each
  @gens.each { |g| g.rewind }

  while true
    count = 0

    ret = @gens.map { |g|
      if g.end?
        count += 1
        nil
      else
        g.next
      end
    }

    break if count == @gens.size

    yield ret
  end

  self
end

#end?(i = nil) ⇒ Boolean

Returns true if the given nth Enumerable object has reached the end. If no argument is given, returns true if any of the Enumerable objects has reached the end.

Returns:

  • (Boolean)


209
210
211
212
213
214
215
# File 'lib/rubysl/generator/generator.rb', line 209

def end?(i = nil)
  if i.nil?
    @gens.detect { |g| g.end? } ? true : false
  else
    @gens[i].end?
  end
end

#lengthObject

Returns the number of enumerated Enumerable objects, i.e. the size of each row.



202
203
204
# File 'lib/rubysl/generator/generator.rb', line 202

def length
  @gens.length
end

#sizeObject

Returns the number of enumerated Enumerable objects, i.e. the size of each row.



196
197
198
# File 'lib/rubysl/generator/generator.rb', line 196

def size
  @gens.size
end