diff options
Diffstat (limited to 'queue.lua')
-rw-r--r-- | queue.lua | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/queue.lua b/queue.lua new file mode 100644 index 0000000..303728e --- /dev/null +++ b/queue.lua @@ -0,0 +1,35 @@ +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 |