class Bundler::SpecSet

def append_subgraph(specs, current)

def append_subgraph(specs, current)
  return if specs[current.name]
  specs[current.name] = true
  current.dependencies.each do |dep|
    next if dep.type == :development
    append_subgraph(specs, lookup[dep.name])
  end
end

def each

def each
  sorted.each { |s| yield s }
end

def for(*deps)

def for(*deps)
  specs = {}
  deps.flatten.each do |dep|
    current = lookup[dep.respond_to?(:name) ? dep.name : dep]
    append_subgraph(specs, current)
  end
  sorted.select { |s| specs[s.name] }
end

def initialize(specs)

def initialize(specs)
  @specs = specs.sort_by { |s| s.name }
end

def length

def length
  @specs.length
end

def lookup

def lookup
  @lookup ||= Hash.new do |h,k|
    h[k] = @specs.find { |s| s.name == k }
  end
end

def sorted

def sorted
  @sorted ||= ([lookup['rake']] + tsort).compact.uniq
end

def to_a

def to_a
  sorted.dup
end

def tsort_each_child(s)

def tsort_each_child(s)
  s.dependencies.sort_by { |d| d.name }.each do |d|
    next if d.type == :development
    yield lookup[d.name]
  end
end

def tsort_each_node

def tsort_each_node
  @specs.each { |s| yield s }
end