class Verifly::DependentCallbacks::CallbackGroup::TSortService

Implements topoplogy sorting of callbacks. As far as CallbackGroup is designed to store Callbacks, it is unable to link them into graph immediately . Service can do it, because if some callbacks are missing on compilation stage, there should be an error @see ruby-doc.org/stdlib-2.3.4/libdoc/tsort/rdoc/TSort.html @attr dependencies [{ Callback => Callback }] dependency graph

Attributes

dependencies[RW]

Public Class Methods

call(callback_group) click to toggle source

@param callback_group [CallbackGroup] group to be tsorted @return [[Callback]] tsorted callbacks array (aka sequence)

# File lib/verifly/dependent_callbacks/callback_group.rb, line 25
def self.call(callback_group)
  new(callback_group).tsort
end
new(callback_group) click to toggle source

@param callback_group [CallbackGroup] group to be tsorted

# File lib/verifly/dependent_callbacks/callback_group.rb, line 30
def initialize(callback_group)
  self.dependencies = Hash.new { |h, k| h[k] = Set[] }

  callback_group.list.each do |callback|
    dependencies[callback] ||= []

    callback.before.each do |key|
      dependencies[callback_group.index.fetch(key)] << callback
    end

    callback.after.each do |key|
      dependencies[callback] << callback_group.index.fetch(key)
    end
  end
end

Private Instance Methods

tsort_each_child(node, &block) click to toggle source

@api stdlib @see TSort

# File lib/verifly/dependent_callbacks/callback_group.rb, line 56
def tsort_each_child(node, &block)
  dependencies[node].each(&block)
end
tsort_each_node(&block) click to toggle source

@api stdlib @see TSort

# File lib/verifly/dependent_callbacks/callback_group.rb, line 50
def tsort_each_node(&block)
  dependencies.keys.each(&block)
end