util.iterators: New iterators library
[prosody.git] / util / iterators.lua
1 --[[ Iterators ]]--
2
3 -- Reverse an iterator
4 function reverse(f, s, var)
5         local results = {};
6
7         -- First call the normal iterator
8         while true do
9                 local ret = { f(s, var) };
10                 var = ret[1];
11                 if var == nil then break; end
12                 table.insert(results, 1, ret);
13         end
14         
15         -- Then return our reverse one
16         local i,max = 0, #results;
17         return function (results)
18                         if i<max then
19                                 i = i + 1;
20                                 return unpack(results[i]);
21                         end
22                 end, results;
23 end
24
25 -- Iterate only over keys in a table
26 local function _keys_it(t, key)
27         return (next(t, key));
28 end
29 function keys(t)
30         return _keys_it, t;
31 end
32
33 -- Iterate only over values in a table
34 function values(t)
35         local key, val;
36         return function (t)
37                 key, val = next(t, key);
38                 return val;
39         end, t;
40 end
41
42 -- Given an iterator, iterate only over unique items
43 function unique(f, s, var)
44         local set = {};
45         
46         return function ()
47                 while true do
48                         local ret = { f(s, var) };
49                         var = ret[1];
50                         if var == nil then break; end
51                         if not set[var] then
52                                 set[var] = true;
53                                 return var;
54                         end
55                 end
56         end;
57 end
58
59 --[[ Return the number of items an iterator returns ]]--
60 function count(f, s, var)
61         local x = 0;
62         
63         while true do
64                 local ret = { f(s, var) };
65                 var = ret[1];
66                 if var == nil then break; end
67                 x = x + 1;
68         end     
69         
70         return x;
71 end
72
73 -- Convert the values returned by an iterator to an array
74 function it2array(f, s, var)
75         local t, var = {};
76         while true do
77                 var = f(s, var);
78                 if var == nil then break; end
79                 table.insert(t, var);
80         end
81         return t;
82 end
83
84 -- Treat the return of an iterator as key,value pairs, 
85 -- and build a table
86 function it2table(f, s, var)
87         local t, var = {};
88         while true do
89                 var, var2 = f(s, var);
90                 if var == nil then break; end
91                 t[var] = var2;
92         end
93         return t;
94 end