module ActionView::CollectionCaching

def cache_collection_render(instrumentation_payload, view, template, collection)

def cache_collection_render(instrumentation_payload, view, template, collection)
  return yield(collection) unless will_cache?(@options, view)
  collection_iterator = collection
  # Result is a hash with the key represents the
  # key used for cache lookup and the value is the item
  # on which the partial is being rendered
  keyed_collection, ordered_keys = collection_by_cache_keys(view, template, collection)
  # Pull all partials from cache
  # Result is a hash, key matches the entry in
  # `keyed_collection` where the cache was retrieved and the
  # value is the value that was present in the cache
  cached_partials = collection_cache.read_multi(*keyed_collection.keys)
  instrumentation_payload[:cache_hits] = cached_partials.size
  # Extract the items for the keys that are not found
  collection = keyed_collection.reject { |key, _| cached_partials.key?(key) }.values
  rendered_partials = collection.empty? ? [] : yield(collection_iterator.from_collection(collection))
  index = 0
  keyed_partials = fetch_or_cache_partial(cached_partials, template, order_by: keyed_collection.each_key) do
    # This block is called once
    # for every cache miss while preserving order.
    rendered_partials[index].tap { index += 1 }
  end
  ordered_keys.map do |key|
    keyed_partials[key]
  end
end