local condition = require("cqueues.condition") local fifo = {} function fifo.new() return setmetatable({ cond = condition.new() }, { __index = fifo }) end function fifo.signal(f) f.cond:signal() end function fifo.get(f) while not f.head do f.cond:wait() end local data = f.head.data f.head = f.head.tail return data end function fifo.put(f, data) local tail = f.head while tail and tail.tail do tail = tail.tail end if tail then tail.tail = { data = data } else f.head = { data = data } end fifo.signal(f) end function fifo.iter(f) return function () return fifo.get(f) end end return fifo