Class: ConcurrentIterable::Iterator
- Inherits:
-
Object
- Object
- ConcurrentIterable::Iterator
- Defined in:
- lib/concurrent_iterable/iterator.rb
Instance Method Summary collapse
- #all?(&block) ⇒ Boolean
- #any?(&block) ⇒ Boolean
- #detect(&block) ⇒ Object
- #each(&block) ⇒ Object
-
#initialize(iterable, concurrency: ConcurrentIterable.config.concurrency) ⇒ Iterator
constructor
A new instance of Iterator.
- #map(&block) ⇒ Object
- #select(&block) ⇒ Object
Constructor Details
#initialize(iterable, concurrency: ConcurrentIterable.config.concurrency) ⇒ Iterator
Returns a new instance of Iterator.
5 6 7 8 9 |
# File 'lib/concurrent_iterable/iterator.rb', line 5 def initialize(iterable, concurrency: ConcurrentIterable.config.concurrency) @iterable = iterable @concurrency = concurrency @executor = Concurrent::FixedThreadPool.new(concurrency) end |
Instance Method Details
#all?(&block) ⇒ Boolean
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
# File 'lib/concurrent_iterable/iterator.rb', line 66 def all?(&block) missing = false iterable.each_slice(concurrency).each.with_index do |group, group_index| results = Concurrent::Array.new(group.length) group.length.times.map do |index| Concurrent::Promises.future(executor) do results[index] = yield group[index] end end.each(&:wait!) if results.index { |result| !result } missing = true break end end !missing end |
#any?(&block) ⇒ Boolean
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
# File 'lib/concurrent_iterable/iterator.rb', line 83 def any?(&block) found = false iterable.each_slice(concurrency).each.with_index do |group, group_index| results = Concurrent::Array.new(group.length) group.length.times.map do |index| Concurrent::Promises.future(executor) do results[index] = yield group[index] end end.each(&:wait!) if results.index(&:itself) found = true break end end found end |
#detect(&block) ⇒ Object
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
# File 'lib/concurrent_iterable/iterator.rb', line 32 def detect(&block) result = nil iterable.each_slice(concurrency).each.with_index do |group, group_index| results = Concurrent::Array.new(group.length) group.length.times.map do |index| Concurrent::Promises.future(executor) do results[index] = yield group[index] end end.each(&:wait!) found_index = results.index(&:itself) if found_index result = iterable[group_index * concurrency + found_index] break end end result end |
#each(&block) ⇒ Object
11 12 13 14 15 16 17 |
# File 'lib/concurrent_iterable/iterator.rb', line 11 def each(&block) iterable.each_slice(concurrency).each do |group| group.length.times.map do |index| Concurrent::Promises.future(executor) { yield group[index] } end.each(&:wait!) end end |
#map(&block) ⇒ Object
19 20 21 22 23 24 25 26 27 28 29 30 |
# File 'lib/concurrent_iterable/iterator.rb', line 19 def map(&block) result = Concurrent::Array.new(iterable.length) iterable.each_slice(concurrency).each.with_index do |group, group_index| group.length.times.map do |index| Concurrent::Promises.future(executor) do result_index = group_index * concurrency + index result[result_index] = yield group[index] end end.each(&:wait!) end result end |
#select(&block) ⇒ Object
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/concurrent_iterable/iterator.rb', line 50 def select(&block) results = [] iterable.each_slice(concurrency).each do |group| group_evals = Concurrent::Array.new(group.length) group.length.times.map do |index| Concurrent::Promises.future(executor) do group_evals[index] = yield group[index] end end.each(&:wait!) group_evals.each.with_index do |eval, index| results << group[index] if eval end end results end |