class BubbleWrap::Reactor::Queue

A GCD scheduled, linear queue.

This class provides a simple “Queue” like abstraction on top of the GCD scheduler.

Useful as an API sugar for stateful protocols

q = BubbleWrap::Reactor::Queue.new
q.push('one', 'two', 'three')
3.times do
  q.pop{ |msg| puts(msg) }
end

Public Class Methods

new() click to toggle source

Create a new queue

# File motion/reactor/queue.rb, line 18
def initialize
  @items = []
end

Public Instance Methods

empty?() click to toggle source

Is the queue empty?

# File motion/reactor/queue.rb, line 23
def empty?
  @items.empty?
end
pop(*args, &blk) click to toggle source

Pop items off the queue, running the block on the work queue. The pop will not happen immediately, but at some point in the future, either in the next tick, if the queue has data, or when the queue is populated.

# File motion/reactor/queue.rb, line 44
def pop(*args, &blk)
  cb = proc do
    blk.call(*args)
  end
  ::BubbleWrap::Reactor.schedule do
    if @items.empty?
      @popq << cb
    else
      cb.call @items.shift
    end
  end
  nil # Always returns nil
end
push(*items) click to toggle source

Push items onto the work queue. The items will not appear in the queue immediately, but will be scheduled for addition.

# File motion/reactor/queue.rb, line 34
def push(*items)
  ::BubbleWrap::Reactor.schedule do
    @items.push(*items)
    @popq.shift.call @items.shift until @items.empty? || @popq.empty?
  end
end
size() click to toggle source

The size of the queue

# File motion/reactor/queue.rb, line 28
def size
  @items.size
end