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