#--- coroutine.rb ---
require 'thread'
class Thread
def queue
@queue = SizedQueue.new(1) unless defined? @queue
@queue
end
def resume(val=nil)
self.queue.enq val
Thread.current.queue.deq
end
end
class Coroutine < Thread
def initialize(&block)
caller = Thread.current
super() {
caller.resume block.call(self.queue.deq)
}
end
end
if $0 == __FILE__
main = Thread.current
c = Coroutine.new {|a|
p a
p 2
p main.resume(2.5)
p 4
p main.resume(4.5)
p 6
p main.resume(6.5)
}
p 1
p c.resume(1.5)
p 3
p c.resume(3.5)
p 5
p c.resume(5.5)
end
-- DaleBrayden - 05 May 2003