Sha256: c63e6fdb0801dade5116c1705d7559e250416ef0026a95478d6b43ef8fcca65c

Contents?: true

Size: 868 Bytes

Versions: 1

Compression:

Stored size: 868 Bytes

Contents

require 'set'

module Furnace
  module Transform
    class Iterative
      LOOP_THRESHOLD = 100

      def initialize(stages, options={})
        @stages = stages

        @debug      = options[:debug]
        @iterations = 0
      end

      def run(context)
        self_changed = false

        loop do
          changed = Set[]

          @stages.each do |stage|
            # FIXME?
            return self_changed if stage.nil?

            if stage.run(context)
              self_changed = true
              changed.add stage
            end
          end

          return self_changed if changed.empty?

          if @debug
            @iterations += 1
            if @iterations > LOOP_THRESHOLD
              raise "Transform::Iterative has detected infinite loop in: #{changed.to_a}"
            end
          end
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
furnace-0.4.0.beta.2 lib/furnace/transform/iterative.rb