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 -- Skip the first n items an iterator returns
94 function skip(n, f, s, var)
101 -- Return the last n items an iterator returns
102 function tail(n, f, s, var)
103 local results, count = {}, 0;
105 local ret = { f(s, var) };
107 if var == nil then break; end
108 results[(count%n)+1] = ret;
112 if n > count then n = count; end
117 if pos > n then return nil; end
118 return unpack(results[((count-1+pos)%n)+1]);
120 --return reverse(head(n, reverse(f, s, var)));
123 -- Convert the values returned by an iterator to an array
124 function it2array(f, s, var)
128 if var == nil then break; end
129 table.insert(t, var);
134 -- Treat the return of an iterator as key,value pairs,
136 function it2table(f, s, var)
139 var, var2 = f(s, var);
140 if var == nil then break; end