class Middleman::CoreExtensions::Collections::CollectionsExtension

def before_configuration

def before_configuration
  @leaves.clear
end

def collector_value(label)

def collector_value(label)
  @values_by_name[label]
end

def data_collector

def data_collector
  live_collector { |app, _| app.data }
end

def initialize(app, options_hash = ::Middleman::EMPTY_HASH, &block)

def initialize(app, options_hash = ::Middleman::EMPTY_HASH, &block)
  super
  @leaves = Set.new
  @collectors_by_name = {}
  @values_by_name = {}
  @collector_roots = []
  @lock = Monitor.new
end

def live_collector(&block)

def live_collector(&block)
  root = LazyCollectorRoot.new(self)
  @collector_roots << {
    root: root,
    block: block
  }
  root
end

def manipulate_resource_list_container!(resource_list)

def manipulate_resource_list_container!(resource_list)
  @lock.synchronize do
    @collector_roots.each do |pair|
      dataset = pair[:block].call(app, resource_list)
      pair[:root].realize!(dataset)
    end
    ctx = StepContext.new(app)
    StepContext.current = ctx
    leaves = @leaves.dup
    @collectors_by_name.each do |k, v|
      @values_by_name[k] = v.value(ctx)
      leaves.delete v
    end
    # Execute code paths
    leaves.each do |v|
      v.value(ctx)
    end
    # Inject descriptors
    ctx.descriptors.each do |d|
      d.execute_descriptor(app, resource_list)
    end
    StepContext.current = nil
  end
end

def pagination

def pagination
  current_resource.data.pagination
end

def register_collector(label, endpoint)

def register_collector(label, endpoint)
  @collectors_by_name[label] = endpoint
end

def sitemap_collector

def sitemap_collector
  live_collector { |_, resources| resources.to_a }
end