2 -- Copyright (C) 2008-2010 Matthew Wild
3 -- Copyright (C) 2008-2010 Waqas Hussain
5 -- This project is MIT/X11 licensed. Please see the
6 -- COPYING file in the source package for more information.
11 -- Reverse an iterator
12 function reverse(f, s, var)
15 -- First call the normal iterator
17 local ret = { f(s, var) };
19 if var == nil then break; end
20 table.insert(results, 1, ret);
23 -- Then return our reverse one
24 local i,max = 0, #results;
25 return function (results)
28 return unpack(results[i]);
33 -- Iterate only over keys in a table
34 local function _keys_it(t, key)
35 return (next(t, key));
41 -- Iterate only over values in a table
45 key, val = next(t, key);
50 -- Given an iterator, iterate only over unique items
51 function unique(f, s, var)
56 local ret = { f(s, var) };
58 if var == nil then break; end
67 --[[ Return the number of items an iterator returns ]]--
68 function count(f, s, var)
72 local ret = { f(s, var) };
74 if var == nil then break; end
81 -- Return the first n items an iterator returns
82 function head(n, f, s, var)
84 return function (s, var)
93 function tail(n, f, s, var)
94 local results, count = {}, 0;
96 local ret = { f(s, var) };
98 if var == nil then break; end
99 results[(count%n)+1] = ret;
103 if n > count then n = count; end
108 if pos > n then return nil; end
109 return unpack(results[((count-1+pos)%n)+1]);
111 --return reverse(head(n, reverse(f, s, var)));
114 -- Convert the values returned by an iterator to an array
115 function it2array(f, s, var)
119 if var == nil then break; end
120 table.insert(t, var);
125 -- Treat the return of an iterator as key,value pairs,
127 function it2table(f, s, var)
130 var, var2 = f(s, var);
131 if var == nil then break; end