Class: SyncEnumerator

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/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.



224
225
226
# File 'lib/generator.rb', line 224

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

Instance Method Details

#eachObject

Enumerates rows of the Enumerable objects.



252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
# File 'lib/generator.rb', line 252

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

  loop do
    count = 0

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

    if count == @gens.size
	break
    end

    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)


243
244
245
246
247
248
249
# File 'lib/generator.rb', line 243

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.



236
237
238
# File 'lib/generator.rb', line 236

def length
  @gens.length
end

#sizeObject

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



230
231
232
# File 'lib/generator.rb', line 230

def size
  @gens.size
end