module AWS::Core::Collection::Limitable

def _each_item next_token, limit, options = {}, &block

def _each_item next_token, limit, options = {}, &block
  raise NotImplementedError
end

def _limit

def _limit
  nil
end

def each_batch options = {}, &block

def each_batch options = {}, &block
  each_opts  = options.dup
  ## limit and batch size should accept string values like '10'
  limit = each_opts.delete(:limit) || _limit
  limit = limit.to_i if limit
  batch_size = each_opts.delete(:batch_size)
  batch_size = batch_size.to_i if batch_size
  next_token = each_opts.delete(:next_token)
  total = 0  # count of items yeilded across all batches
  begin
    max = nil
    if limit or batch_size
      max = []
      max << (limit - total) if limit
      max << batch_size if batch_size
      max = max.min
    end
    batch = []
    next_token = _each_item(next_token, max, each_opts.dup) do |item|
      total += 1
      batch << item
    end
    yield(batch)
  end until next_token.nil? or (limit and limit == total)
  next_token
end