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.
13 -- Reverse an iterator
14 function it.reverse(f, s, var)
17 -- First call the normal iterator
19 local ret = { f(s, var) };
21 if var == nil then break; end
22 table.insert(results, 1, ret);
25 -- Then return our reverse one
26 local i,max = 0, #results;
27 return function (results)
30 return unpack(results[i]);
35 -- Iterate only over keys in a table
36 local function _keys_it(t, key)
37 return (next(t, key));
43 -- Iterate only over values in a table
47 key, val = next(t, key);
52 -- Given an iterator, iterate only over unique items
53 function it.unique(f, s, var)
58 local ret = { f(s, var) };
60 if var == nil then break; end
69 --[[ Return the number of items an iterator returns ]]--
70 function it.count(f, s, var)
74 local ret = { f(s, var) };
76 if var == nil then break; end
83 -- Return the first n items an iterator returns
84 function it.head(n, f, s, var)
86 return function (s, var)
95 -- Skip the first n items an iterator returns
96 function it.skip(n, f, s, var)
103 -- Return the last n items an iterator returns
104 function it.tail(n, f, s, var)
105 local results, count = {}, 0;
107 local ret = { f(s, var) };
109 if var == nil then break; end
110 results[(count%n)+1] = ret;
114 if n > count then n = count; end
119 if pos > n then return nil; end
120 return unpack(results[((count-1+pos)%n)+1]);
122 --return reverse(head(n, reverse(f, s, var)));
125 local function _range_iter(max, curr) if curr < max then return curr + 1; end end
126 function it.range(x, y)
127 if not y then x, y = 1, x; end -- Default to 1..x if y not given
128 return _range_iter, y, x-1;
131 -- Convert the values returned by an iterator to an array
132 function it.to_array(f, s, var)
136 if var == nil then break; end
137 table.insert(t, var);
142 -- Treat the return of an iterator as key,value pairs,
144 function it.to_table(f, s, var)
147 var, var2 = f(s, var);
148 if var == nil then break; end