Sha256: 310775bbae2c1fc9ae9efe7ea508a4cb681a3c6d05bb3ad5420310089bf063fd

Contents?: true

Size: 1.57 KB

Versions: 1

Compression:

Stored size: 1.57 KB

Contents

module DRbQS
  class TaskGenerator
    def initialize(data = {})
      data.each do |key, val|
        instance_variable_set("@#{key.to_s}", val)
      end
      @__fiber__ = nil
      @__iterate__ = nil
      @__fiber_init__ = nil
    end

    def have_next?
      !!@__fiber__
    end

    def create_add_task(*args, &block)
      Fiber.yield(DRbQS::Task.new(*args, &block))
    end

    def set(iterate = 1, &block)
      @__iterate__ = iterate
      @__fiber_init__ = lambda do
        @__fiber__ = Fiber.new do
          instance_eval(&block)
          nil
        end
      end
    end

    def init
      @__fiber_init__.call
    end

    # Return an array of new tasks.
    def new_tasks
      if @__fiber__
        task_ary = []
        @__iterate__.times do |i|
          if task_new = @__fiber__.resume
            case task_new
            when DRbQS::Task
              task_ary << task_new
            when Array
              task_ary.concat(task_new)
            else
              raise "Invalid type of new task."
            end
          else
            @__fiber__ = nil
            break
          end
        end
        if task_ary.size > 0
          return task_ary
        end
      end
      nil
    end

    # Create all tasks for test and return true if all tasks created properly.
    def debug_all_tasks(limit = nil)
      i = 0
      while ary = new_tasks
        ary.each? do |t|
          unless DRbQS::TaskGenerator === t
            raise "Invalid task by #{i}th generation: #{t.inspect}"
          end
        end
        i += 1
      end
      true
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
drbqs-0.0.6 lib/drbqs/task_generator.rb