Sha256: d4e72742203375b6ec26deec8a38ca6954f5224117fb399b9cb08a7ea53fe538

Contents?: true

Size: 1.9 KB

Versions: 35

Compression:

Stored size: 1.9 KB

Contents

require 'tsort'

module Pacer
  module Utils
    # Include this module in your traversal to use ruby's built-in TSort
    # utility to sort your vertices according to the direction of the
    # edges that connect them.
    module TSort
      module Route
        include ::TSort

        attr_accessor :tsort_anon_mod

        # NOTE: this is a great example of dynamically injecting a custom method
        # into a route.
        def dependencies(&block)
          anon_mod = Module.new
          class << anon_mod
            def inspect
              '<TSort anon mixin module>'
            end
          end
          anon_mod.const_set :Route, TSort::Route
          anon_mod.const_set :Vertex, Module.new
          anon_mod::Vertex.const_set :DependenciesBlock, block
          anon_mod::Vertex.instance_eval do
            def self.included(target)
              target.const_set :DependenciesBlock, self::DependenciesBlock
            end
          end
          route = v.add_extensions [TSort, anon_mod]
          route.tsort_anon_mod = anon_mod
          route
        end

        def tsort_each_node
          v.each do |vertex|
            yield vertex
          end
        end

        def tsort_each_child(node)
          node.tsort_dependencies(tsort_anon_mod).each do |vertex|
            yield vertex
          end
        end

        def tsort
          super.to_route(:graph => graph,
                         :element_type => :vertex,
                         :extensions => (extensions - [TSort, tsort_anon_mod]))
        end
      end

      module Vertex
        def tsort_each_node
          yield self
        end

        def tsort_dependencies(tsort_anon_mod = nil)
          if self.class.const_defined? :DependenciesBlock
            self.class::DependenciesBlock.call(self).add_extensions([TSort, tsort_anon_mod])
          else
            self.in(extensions)
          end
        end
      end
    end
  end
end

Version data entries

35 entries across 35 versions & 1 rubygems

Version Path
pacer-2.0.24-java lib/pacer/utils/tsort.rb
pacer-2.0.22-java lib/pacer/utils/tsort.rb
pacer-2.0.20-java lib/pacer/utils/tsort.rb
pacer-2.0.19-java lib/pacer/utils/tsort.rb
pacer-2.0.18-java lib/pacer/utils/tsort.rb
pacer-2.0.17-java lib/pacer/utils/tsort.rb
pacer-2.0.16-java lib/pacer/utils/tsort.rb
pacer-2.0.15-java lib/pacer/utils/tsort.rb
pacer-2.0.14-java lib/pacer/utils/tsort.rb
pacer-2.0.13-java lib/pacer/utils/tsort.rb
pacer-2.0.12-java lib/pacer/utils/tsort.rb
pacer-2.0.10-java lib/pacer/utils/tsort.rb
pacer-2.0.10.pre-java lib/pacer/utils/tsort.rb
pacer-2.0.8-java lib/pacer/utils/tsort.rb
pacer-2.0.6-java lib/pacer/utils/tsort.rb
pacer-2.0.4.pre-java lib/pacer/utils/tsort.rb
pacer-2.0.0.pre-java lib/pacer/utils/tsort.rb
pacer-1.6.0-java lib/pacer/utils/tsort.rb
pacer-1.5.4-java lib/pacer/utils/tsort.rb
pacer-1.5.3-java lib/pacer/utils/tsort.rb