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={}, &block)

def initialize(app, options_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(resources)

def manipulate_resource_list(resources)
  @lock.synchronize do
    @collector_roots.each do |pair|
      dataset = pair[:block].call(app, resources)
      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
    results = ctx.descriptors.reduce(resources) do |sum, d|
      d.execute_descriptor(app, sum)
    end
    StepContext.current = nil
    results
  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 }
end