module AWS::S3::PaginatedCollection

def each(options = {}, &block)

def each(options = {}, &block)
  each_page(options) do |page|
    each_member_in_page(page, &block)
  end
  nil
end

def each_member_in_page(page, &block); end

def each_member_in_page(page, &block); end

def each_page(options = {}, &block)

def each_page(options = {}, &block)
  opts = list_options(options)
  limit = options[:limit]
  batch_size = options[:batch_size] || 1000
  markers = {}
  received = 0
  loop do
    page_opts = opts.dup
    page_opts.merge!(markers)
    page_opts[limit_param] =
      limit ? [limit - received, batch_size].min : batch_size
    page = list_request(page_opts)
    markers = next_markers(page)
    received += page_size(page)
    yield(page)
    return unless page.truncated?
  end
end

def limit_param

def limit_param
  raise NotImplementedError
end

def list_options(options)

def list_options(options)
  opts = {}
  opts[:bucket_name] = bucket.name if respond_to?(:bucket)
  opts
end

def list_request(options)

def list_request(options)
  raise NotImplementedError
end

def next_markers(page)

def next_markers(page)
  pagination_markers.inject({}) do |markers, marker|
    markers[marker] = page.send("next_#{marker}")
    markers
  end
end

def page_size(resp)

def page_size(resp)
  (resp.respond_to?(:common_prefixes) and
   prefixes = resp.common_prefixes and
   prefixes.size) or 0
end

def pagination_markers

def pagination_markers
  [:key_marker]
end