aboutsummaryrefslogtreecommitdiffstats
path: root/util/iterators.lua
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2009-03-25 03:01:10 +0000
committerMatthew Wild <mwild1@gmail.com>2009-03-25 03:01:10 +0000
commit996a74ba945189daf9cc031866dc36931522bf1a (patch)
tree99ec48d956ad0dcbc12dae9553b10234d7a31e8e /util/iterators.lua
parent7b1eacf880c960310c3557065345156763f5fb8b (diff)
downloadprosody-996a74ba945189daf9cc031866dc36931522bf1a.tar.gz
prosody-996a74ba945189daf9cc031866dc36931522bf1a.zip
util.iterators: New iterators library
Diffstat (limited to 'util/iterators.lua')
-rw-r--r--util/iterators.lua94
1 files changed, 94 insertions, 0 deletions
diff --git a/util/iterators.lua b/util/iterators.lua
new file mode 100644
index 00000000..7c9b5269
--- /dev/null
+++ b/util/iterators.lua
@@ -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