Sha256: 725ef5f49a73c600a3d31f94cc345a952598f853201f524f825102f2227154f0

Contents?: true

Size: 867 Bytes

Versions: 1

Compression:

Stored size: 867 Bytes

Contents

# frozen_string_literal: true

module SlowEnumeratorTools
  module Batcher
    def self.batch(enum)
      q = Queue.new
      stop = Object.new

      t =
        Thread.new do
          enum.each do |e|
            q << e
          end
          q << stop
        end

      Enumerator.new do |y|
        loop do
          res = []
          ended = false

          # pop first
          elem = q.pop
          break if stop.equal?(elem)
          res << elem

          loop do
            # pop remaining
            begin
              elem = q.pop(true)
            rescue ThreadError
              break
            end
            if stop.equal?(elem)
              ended = true
              break
            end
            res << elem
          end

          y << res
          break if ended
        end

        t.join
      end.lazy
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
slow_enumerator_tools-1.0.0 lib/slow_enumerator_tools/batcher.rb