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