util.iterators: New iterators library
authorMatthew Wild <mwild1@gmail.com>
Wed, 25 Mar 2009 03:01:10 +0000
changeset 919 75b8afb79143
parent 918 967edf874df7
child 920 e302cbc9d036
util.iterators: New iterators library
util/iterators.lua
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/util/iterators.lua	Wed Mar 25 03:01:10 2009 +0000
@@ -0,0 +1,94 @@
+--[[ Iterators ]]--
+
+-- Reverse an iterator
+function reverse(f, s, var)
+	local results = {};
+
+	-- First call the normal iterator
+	while true do
+		local ret = { f(s, var) };
+		var = ret[1];
+	        if var == nil then break; end
+		table.insert(results, 1, ret);
+	end
+	
+	-- Then return our reverse one
+	local i,max = 0, #results;
+	return function (results)
+			if i<max then
+				i = i + 1;
+				return unpack(results[i]);
+			end
+		end, results;
+end
+
+-- Iterate only over keys in a table
+local function _keys_it(t, key)
+	return (next(t, key));
+end
+function keys(t)
+	return _keys_it, t;
+end
+
+-- Iterate only over values in a table
+function values(t)
+	local key, val;
+	return function (t)
+		key, val = next(t, key);
+		return val;
+	end, t;
+end
+
+-- Given an iterator, iterate only over unique items
+function unique(f, s, var)
+	local set = {};
+	
+	return function ()
+		while true do
+			local ret = { f(s, var) };
+			var = ret[1];
+		        if var == nil then break; end
+		        if not set[var] then
+				set[var] = true;
+				return var;
+			end
+		end
+	end;
+end
+
+--[[ Return the number of items an iterator returns ]]--
+function count(f, s, var)
+	local x = 0;
+	
+	while true do
+		local ret = { f(s, var) };
+		var = ret[1];
+	        if var == nil then break; end
+		x = x + 1;
+	end	
+	
+	return x;
+end
+
+-- Convert the values returned by an iterator to an array
+function it2array(f, s, var)
+	local t, var = {};
+	while true do
+		var = f(s, var);
+	        if var == nil then break; end
+		table.insert(t, var);
+	end
+	return t;
+end
+
+-- Treat the return of an iterator as key,value pairs, 
+-- and build a table
+function it2table(f, s, var)
+	local t, var = {};
+	while true do
+		var, var2 = f(s, var);
+	        if var == nil then break; end
+		t[var] = var2;
+	end
+	return t;
+end