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 local t_insert = table.insert;
14 local select, unpack, next = select, unpack, next;
15 local function pack(...) return { n = select("#", ...), ... }; end
17 -- Reverse an iterator
18 function it.reverse(f, s, var)
21 -- First call the normal iterator
23 local ret = { f(s, var) };
25 if var == nil then break; end
26 t_insert(results, 1, ret);
29 -- Then return our reverse one
30 local i,max = 0, #results;
31 return function (results)
34 return unpack(results[i]);
39 -- Iterate only over keys in a table
40 local function _keys_it(t, key)
41 return (next(t, key));
47 -- Iterate only over values in a table
51 key, val = next(t, key);
56 -- Given an iterator, iterate only over unique items
57 function it.unique(f, s, var)
62 local ret = pack(f(s, var));
64 if var == nil then break; end
67 return unpack(ret, 1, ret.n);
73 --[[ Return the number of items an iterator returns ]]--
74 function it.count(f, s, var)
79 if var == nil then break; end
86 -- Return the first n items an iterator returns
87 function it.head(n, f, s, var)
89 return function (s, var)
98 -- Skip the first n items an iterator returns
99 function it.skip(n, f, s, var)
106 -- Return the last n items an iterator returns
107 function it.tail(n, f, s, var)
108 local results, count = {}, 0;
110 local ret = pack(f(s, var));
112 if var == nil then break; end
113 results[(count%n)+1] = ret;
117 if n > count then n = count; end
122 if pos > n then return nil; end
123 local ret = results[((count-1+pos)%n)+1];
124 return unpack(ret, 1, ret.n);
126 --return reverse(head(n, reverse(f, s, var))); -- !
129 function it.filter(filter, f, s, var)
130 if type(filter) ~= "function" then
131 local filter_value = filter;
132 function filter(x) return x ~= filter_value; end
134 return function (s, var)
136 repeat ret = pack(f(s, var));
138 until var == nil or filter(unpack(ret, 1, ret.n));
139 return unpack(ret, 1, ret.n);
143 local function _ripairs_iter(t, key) if key > 1 then return key-1, t[key-1]; end end
144 function it.ripairs(t)
145 return _ripairs_iter, t, #t+1;
148 local function _range_iter(max, curr) if curr < max then return curr + 1; end end
149 function it.range(x, y)
150 if not y then x, y = 1, x; end -- Default to 1..x if y not given
151 return _range_iter, y, x-1;
154 -- Convert the values returned by an iterator to an array
155 function it.to_array(f, s, var)
159 if var == nil then break; end
165 -- Treat the return of an iterator as key,value pairs,
167 function it.to_table(f, s, var)
170 var, var2 = f(s, var);
171 if var == nil then break; end