util.queue: Add 'consume()' convenience iterator
authorMatthew Wild <mwild1@gmail.com>
Sat, 23 Mar 2019 08:47:55 +0000
changeset 9905 c8b75239846c
parent 9904 f2104b36f673
child 9906 3eea63a68e0f
util.queue: Add 'consume()' convenience iterator
spec/util_queue_spec.lua
util/queue.lua
--- a/spec/util_queue_spec.lua	Sat Mar 23 04:00:55 2019 +0100
+++ b/spec/util_queue_spec.lua	Sat Mar 23 08:47:55 2019 +0000
@@ -100,4 +100,41 @@
 
 		end);
 	end);
+	describe("consume()", function ()
+		it("should work", function ()
+			local q = queue.new(10);
+			for i = 1, 5 do
+				q:push(i);
+			end
+			local c = 0;
+			for i in q:consume() do
+				assert(i == c + 1);
+				assert(q:count() == (5-i));
+				c = i;
+			end
+		end);
+
+		it("should work even if items are pushed in the loop", function ()
+			local q = queue.new(10);
+			for i = 1, 5 do
+				q:push(i);
+			end
+			local c = 0;
+			for i in q:consume() do
+				assert(i == c + 1);
+				if c < 3 then
+					assert(q:count() == (5-i));
+				else
+					assert(q:count() == (6-i));
+				end
+
+				c = i;
+
+				if c == 3 then
+					q:push(6);
+				end
+			end
+			assert.equal(c, 6);
+		end);
+	end);
 end);
--- a/util/queue.lua	Sat Mar 23 04:00:55 2019 +0100
+++ b/util/queue.lua	Sat Mar 23 08:47:55 2019 +0000
@@ -64,6 +64,9 @@
 				return pos+1, t._items[read_pos];
 			end, self, 0;
 		end;
+		consume = function (self)
+			return self.pop, self;
+		end;
 	};
 end