RailsEventStore/rails_event_store

View on GitHub
ruby_event_store/lib/ruby_event_store/batch_enumerator.rb

Summary

Maintainability
A
35 mins
Test Coverage
# frozen_string_literal: true

module RubyEventStore
  class BatchEnumerator
    def initialize(batch_size, total_limit, reader)
      @batch_size = batch_size
      @total_limit = total_limit
      @reader = reader
    end

    def each
      return to_enum unless block_given?

      0.step(total_limit - 1, batch_size) do |batch_offset|
        batch_limit = [batch_size, total_limit - batch_offset].min
        result = reader.call(batch_offset, batch_limit)

        yield result if result.any?
        break if result.size < batch_size
      end
    end

    def first
      each.first
    end

    def to_a
      each.to_a
    end

    private

    attr_reader :batch_size, :total_limit, :reader
  end
end