Changeset

9901:c8b75239846c

util.queue: Add 'consume()' convenience iterator
author Matthew Wild <mwild1@gmail.com>
date Sat, 23 Mar 2019 08:47:55 +0000
parents 9900:f2104b36f673
children 9902:3eea63a68e0f
files spec/util_queue_spec.lua util/queue.lua
diffstat 2 files changed, 40 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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