local cqueues = require'cqueues' local condition = require'cqueues.condition' local cqaux = require'cqueues.auxlib' local Queue = {} function Queue.make() return setmetatable({ items = {}, cv = condition.new(), }, {__index=Queue}) end function Queue.enqueue(self, item) table.insert(self.items, item) self.cv:signal() end function Queue.iter(self) return cqaux.wrap(function() while true do while #self.items > 0 do local items = self.items self.items = {} -- the old switcheroo for _, item in ipairs(items) do coroutine.yield(item) end end self.cv:wait() end end) end return Queue