module Bundler::TSort

def self.tsort_each(each_node, each_child) # :yields: node

:yields: node

# 1
# 3
# 2
#=> 4
Bundler::TSort.tsort_each(each_node, each_child) {|n| p n }
each_child = lambda {|n, &b| g[n].each(&b) }
each_node = lambda {|&b| g.each_key(&b) }
g = {1=>[2, 3], 2=>[4], 3=>[2, 4], 4=>[]}

_each_child_ should have +call+ method which takes a node argument and yields for each child node.
_each_node_ should have +call+ method which yields for each node in the graph.
The graph is represented by _each_node_ and _each_child_.

The iterator version of the Bundler::TSort.tsort method.
def self.tsort_each(each_node, each_child) # :yields: node
  return to_enum(__method__, each_node, each_child) unless block_given?
  each_strongly_connected_component(each_node, each_child) {|component|
    if component.size == 1
      yield component.first
    else
      raise Cyclic.new("topological sort failed: #{component.inspect}")
    end
  }
end