class PositionalGenerator::Builder

def build_stack(graph)

Returns:
  • (Array>) -

Parameters:
  • graph (Array<(Integer, Integer)>) --
def build_stack(graph)
  require 'set'
  terminals = graph.filter_map { |(from, to)| to.nil? && from }
  stack = [terminals]
  seen = Set.new(terminals)
  deps = []
  loop do
    stack[-1].each do |e|
      deps = graph.select { |(from, to)| to == e && !seen.include?(from) }.map do |from, _to|
        seen << from
        from
      end
      stack << deps if deps.any?
    end
    break if deps.empty?
  end
  stack
end