util.iterators: Add sorted_pairs() method
authorMatthew Wild <mwild1@gmail.com>
Fri, 21 Sep 2018 14:27:46 +0100
changeset 9330 f6f1dec164b5
parent 9329 c9c4b8bc53b1
child 9331 a9592107021b
util.iterators: Add sorted_pairs() method
spec/util_iterators_spec.lua
util/iterators.lua
--- a/spec/util_iterators_spec.lua	Mon Sep 17 15:28:53 2018 +0100
+++ b/spec/util_iterators_spec.lua	Fri Sep 21 14:27:46 2018 +0100
@@ -11,4 +11,34 @@
 			assert.same(output, expect);
 		end);
 	end);
+
+	describe("sorted_pairs", function ()
+		it("should produce sorted pairs", function ()
+			local orig = { b = 1, c = 2, a = "foo", d = false };
+			local n, last_key = 0, nil;
+			for k, v in iter.sorted_pairs(orig) do
+				n = n + 1;
+				if last_key then
+					assert(k > last_key, "Expected "..k.." > "..last_key)
+				end
+				last_key = k;
+			end
+			assert.equal("d", last_key);
+			assert.equal(4, n);
+		end);
+
+		it("should allow a custom sort function", function ()
+			local orig = { b = 1, c = 2, a = "foo", d = false };
+			local n, last_key = 0, nil;
+			for k, v in iter.sorted_pairs(orig, function (a, b) return a > b end) do
+				n = n + 1;
+				if last_key then
+					assert(k < last_key, "Expected "..k.." > "..last_key)
+				end
+				last_key = k;
+			end
+			assert.equal("a", last_key);
+			assert.equal(4, n);
+		end);
+	end);
 end);
--- a/util/iterators.lua	Mon Sep 17 15:28:53 2018 +0100
+++ b/util/iterators.lua	Fri Sep 21 14:27:46 2018 +0100
@@ -177,6 +177,19 @@
 	return t;
 end
 
+function it.sorted_pairs(t, sort_func)
+	local keys = it.to_array(it.keys(t));
+	table.sort(keys, sort_func);
+	local i = 0;
+	return function ()
+		i = i + 1;
+		local key = keys[i];
+		if key ~= nil then
+			return key, t[key];
+		end
+	end;
+end
+
 -- Treat the return of an iterator as key,value pairs,
 -- and build a table
 function it.to_table(f, s, var)