8 |
8 |
9 --[[ Iterators ]]-- |
9 --[[ Iterators ]]-- |
10 |
10 |
11 local it = {}; |
11 local it = {}; |
12 |
12 |
|
13 local t_insert = table.insert; |
|
14 local select, unpack, next = select, unpack, next; |
|
15 local function pack(...) return { n = select("#", ...), ... }; end |
|
16 |
13 -- Reverse an iterator |
17 -- Reverse an iterator |
14 function it.reverse(f, s, var) |
18 function it.reverse(f, s, var) |
15 local results = {}; |
19 local results = {}; |
16 |
20 |
17 -- First call the normal iterator |
21 -- First call the normal iterator |
18 while true do |
22 while true do |
19 local ret = { f(s, var) }; |
23 local ret = { f(s, var) }; |
20 var = ret[1]; |
24 var = ret[1]; |
21 if var == nil then break; end |
25 if var == nil then break; end |
22 table.insert(results, 1, ret); |
26 t_insert(results, 1, ret); |
23 end |
27 end |
24 |
28 |
25 -- Then return our reverse one |
29 -- Then return our reverse one |
26 local i,max = 0, #results; |
30 local i,max = 0, #results; |
27 return function (results) |
31 return function (results) |
53 function it.unique(f, s, var) |
57 function it.unique(f, s, var) |
54 local set = {}; |
58 local set = {}; |
55 |
59 |
56 return function () |
60 return function () |
57 while true do |
61 while true do |
58 local ret = { f(s, var) }; |
62 local ret = pack(f(s, var)); |
59 var = ret[1]; |
63 var = ret[1]; |
60 if var == nil then break; end |
64 if var == nil then break; end |
61 if not set[var] then |
65 if not set[var] then |
62 set[var] = true; |
66 set[var] = true; |
63 return var; |
67 return unpack(ret, 1, ret.n); |
64 end |
68 end |
65 end |
69 end |
66 end; |
70 end; |
67 end |
71 end |
68 |
72 |
69 --[[ Return the number of items an iterator returns ]]-- |
73 --[[ Return the number of items an iterator returns ]]-- |
70 function it.count(f, s, var) |
74 function it.count(f, s, var) |
71 local x = 0; |
75 local x = 0; |
72 |
76 |
73 while true do |
77 while true do |
74 local ret = { f(s, var) }; |
78 local var = f(s, var); |
75 var = ret[1]; |
|
76 if var == nil then break; end |
79 if var == nil then break; end |
77 x = x + 1; |
80 x = x + 1; |
78 end |
81 end |
79 |
82 |
80 return x; |
83 return x; |
102 |
105 |
103 -- Return the last n items an iterator returns |
106 -- Return the last n items an iterator returns |
104 function it.tail(n, f, s, var) |
107 function it.tail(n, f, s, var) |
105 local results, count = {}, 0; |
108 local results, count = {}, 0; |
106 while true do |
109 while true do |
107 local ret = { f(s, var) }; |
110 local ret = pack(f(s, var)); |
108 var = ret[1]; |
111 var = ret[1]; |
109 if var == nil then break; end |
112 if var == nil then break; end |
110 results[(count%n)+1] = ret; |
113 results[(count%n)+1] = ret; |
111 count = count + 1; |
114 count = count + 1; |
112 end |
115 end |
115 |
118 |
116 local pos = 0; |
119 local pos = 0; |
117 return function () |
120 return function () |
118 pos = pos + 1; |
121 pos = pos + 1; |
119 if pos > n then return nil; end |
122 if pos > n then return nil; end |
120 return unpack(results[((count-1+pos)%n)+1]); |
123 local ret = results[((count-1+pos)%n)+1]; |
|
124 return unpack(ret, 1, ret.n); |
121 end |
125 end |
122 --return reverse(head(n, reverse(f, s, var))); |
126 --return reverse(head(n, reverse(f, s, var))); |
123 end |
127 end |
124 |
128 |
125 local function _ripairs_iter(t, key) if key > 1 then return key-1, t[key-1]; end end |
129 local function _ripairs_iter(t, key) if key > 1 then return key-1, t[key-1]; end end |
137 function it.to_array(f, s, var) |
141 function it.to_array(f, s, var) |
138 local t, var = {}; |
142 local t, var = {}; |
139 while true do |
143 while true do |
140 var = f(s, var); |
144 var = f(s, var); |
141 if var == nil then break; end |
145 if var == nil then break; end |
142 table.insert(t, var); |
146 t_insert(t, var); |
143 end |
147 end |
144 return t; |
148 return t; |
145 end |
149 end |
146 |
150 |
147 -- Treat the return of an iterator as key,value pairs, |
151 -- Treat the return of an iterator as key,value pairs, |