Sha256: a84d337a23b1981d221474e2b98faf7e53e0b88b473f704f0d5c2548cea6ee77
Contents?: true
Size: 1.17 KB
Versions: 1
Compression:
Stored size: 1.17 KB
Contents
# frozen_string_literal: true module SlowEnumeratorTools module Merger def self.merge(enums) enum = Iterator.new(enums).tap(&:start) Enumerator.new do |y| loop { y << enum.next } end.lazy end class Iterator def initialize(enums) @enums = enums @q = SizedQueue.new(5) @done = false end def next raise StopIteration if @done nxt = @q.pop if SlowEnumeratorTools::Util::STOP_OK.equal?(nxt) @done = true raise StopIteration elsif SlowEnumeratorTools::Util::STOP_ERR.equal?(nxt) raise @q.pop else nxt end end def start threads = @enums.map { |enum| spawn_empty_into(enum, @q) } Thread.new do threads.each(&:join) @q << SlowEnumeratorTools::Util::STOP_OK end end protected def spawn_empty_into(enum, queue) Thread.new do begin enum.each { |e| queue << e } rescue StandardError => e queue << SlowEnumeratorTools::Util::STOP_ERR queue << e end end end end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
slow_enumerator_tools-1.1.0 | lib/slow_enumerator_tools/merger.rb |