class ParallelTsort::Sorter
Public Class Methods
new()
click to toggle source
# File lib/parallel_tsort/sorter.rb, line 7 def initialize @deps = [] end
Public Instance Methods
add_dependency(name, deps=[])
click to toggle source
# File lib/parallel_tsort/sorter.rb, line 11 def add_dependency(name, deps=[]) raise SelfDependentNode if deps.include?(name) @deps << [name, deps] end
run(parallel=false)
click to toggle source
# File lib/parallel_tsort/sorter.rb, line 16 def run(parallel=false) result = tsort return result unless parallel groups = [] used = [] result.each_with_index do |node, i| next if used.include?(node) parallel_nodes = result[i..-1].reject do |other_node| next if other_node == node next if used.include?(other_node) is_dependent? node, other_node end used.concat(parallel_nodes) groups << parallel_nodes end groups end
Private Instance Methods
is_dependent?(node, other_node)
click to toggle source
# File lib/parallel_tsort/sorter.rb, line 41 def is_dependent?(node, other_node) other_node = @deps.detect { |dep| dep.first == other_node } dependencies = other_node[1] dependencies.include?(node) || dependencies.detect { |n| is_dependent?(node, n) } end
tsort_each_child(node, &block)
click to toggle source
# File lib/parallel_tsort/sorter.rb, line 52 def tsort_each_child(node, &block) node = @deps.detect { |dep| dep.first == node } raise MissingNode if node.nil? node[1].each(&block) end
tsort_each_node(&block)
click to toggle source
# File lib/parallel_tsort/sorter.rb, line 48 def tsort_each_node(&block) @deps.map(&:first).each(&block) end