Sha256: 3276193ede69df214a7c23e2aeb5704bf8551626ff3591434076404ecc72c189

Contents?: true

Size: 1.26 KB

Versions: 3

Compression:

Stored size: 1.26 KB

Contents

require 'tengine/job/structure'

module Tengine::Job::Structure::Visitor
  module Accepter
  def accept_visitor(visitor)
    visitor.visit(self)
  end
  end

  class Any
    def initialize(&block)
      @block = block
    end
    def visit(vertex)
      if result = @block.call(vertex)
        return result
      end
      vertex.children.each do |child|
        if result = child.accept_visitor(self)
          return result
        end
      end
      return nil
    end
  end

  class All
    def initialize(&block)
      @block = block
    end

    def visit(vertex)
      @block.call(vertex)
      vertex.children.each do |child|
        child.accept_visitor(self)
      end
    end
  end

  class AllWithEdge < All
    def visit(obj)
      if obj.respond_to?(:children)
        super(obj)
      else
        @block.call(obj)
      end
      return unless obj.respond_to?(:edges)
      obj.edges.each{|edge| edge.accept_visitor(self)}
    end
  end

  class TraceEdge
    def initialize(&block)
      @block = block
    end

    def visit(obj)
      @block.call(obj)
      if obj.respond_to?(:destination)
        obj.destination.accept_visitor(self)
      elsif obj.respond_to?(:next_edges)
        obj.next_edges.each{|edge| edge.accept_visitor(self) }
      end
    end
  end

end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
tengine_job-1.2.2 lib/tengine/job/structure/visitor.rb
tengine_job-1.2.1 lib/tengine/job/structure/visitor.rb
tengine_job-1.2.0 lib/tengine/job/structure/visitor.rb