Method: ComputedModel::DepGraph#tsort

Defined in:
lib/computed_model/dep_graph.rb

#tsortComputedModel::DepGraph::Sorted

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Preprocess the graph by topological sorting. This is a necessary step for loader planning.

Examples:

graph = ComputedModel::DepGraph.new
graph << ComputedModel::DepGraph::Node.new(:computed, :foo, { bar: [] })
graph << ComputedModel::DepGraph::Node.new(:loaded, :bar, {})
sorted = graph.tsort

Returns:

Raises:

API:

  • private



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/computed_model/dep_graph.rb', line 62

def tsort
  load_order = []
  visiting = Set[]
  visited = Set[]

  @nodes.each_value do |node|
    next unless node.type == :primary

    load_order << node.name
    visiting.add node.name
    visited.add node.name
  end

  raise ArgumentError, 'No primary loader defined' if load_order.empty?
  raise "Multiple primary fields: #{load_order.inspect}" if load_order.size > 1

  @nodes.each_value do |node|
    tsort_dfs(node.name, load_order, visiting, visited)
  end

  nodes_in_order = load_order.reverse.map { |name| @nodes[name] }
  ComputedModel::DepGraph::Sorted.new(self, nodes_in_order)
end