Comparison

util/iterators.lua @ 5582:7bc2009fdd0c

util.iterators: Add filter() to run results through a filter function
author Matthew Wild <mwild1@gmail.com>
date Fri, 17 May 2013 08:31:03 +0100
parent 5581:167c1da54606
child 5583:78dbece77ce8
comparison
equal deleted inserted replaced
5581:167c1da54606 5582:7bc2009fdd0c
121 pos = pos + 1; 121 pos = pos + 1;
122 if pos > n then return nil; end 122 if pos > n then return nil; end
123 local ret = results[((count-1+pos)%n)+1]; 123 local ret = results[((count-1+pos)%n)+1];
124 return unpack(ret, 1, ret.n); 124 return unpack(ret, 1, ret.n);
125 end 125 end
126 --return reverse(head(n, reverse(f, s, var))); 126 --return reverse(head(n, reverse(f, s, var))); -- !
127 end
128
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
133 end
134 return function (s, var)
135 local ret;
136 repeat ret = pack(f(s, var));
137 var = ret[1];
138 until var == nil or filter(unpack(ret, 1, ret.n));
139 return unpack(ret, 1, ret.n);
140 end, s, var;
127 end 141 end
128 142
129 local function _ripairs_iter(t, key) if key > 1 then return key-1, t[key-1]; end end 143 local function _ripairs_iter(t, key) if key > 1 then return key-1, t[key-1]; end end
130 function it.ripairs(t) 144 function it.ripairs(t)
131 return _ripairs_iter, t, #t+1; 145 return _ripairs_iter, t, #t+1;