# HG changeset patch # User Matthew Wild # Date 1368775863 -3600 # Node ID 7bc2009fdd0c3fe93b2bdb9ff2ca8c0b102a1c1d # Parent 167c1da54606e011a1e11e76126012369ab40b4e util.iterators: Add filter() to run results through a filter function diff -r 167c1da54606 -r 7bc2009fdd0c util/iterators.lua --- a/util/iterators.lua Fri May 17 08:30:28 2013 +0100 +++ b/util/iterators.lua Fri May 17 08:31:03 2013 +0100 @@ -123,7 +123,21 @@ local ret = results[((count-1+pos)%n)+1]; return unpack(ret, 1, ret.n); end - --return reverse(head(n, reverse(f, s, var))); + --return reverse(head(n, reverse(f, s, var))); -- ! +end + +function it.filter(filter, f, s, var) + if type(filter) ~= "function" then + local filter_value = filter; + function filter(x) return x ~= filter_value; end + end + return function (s, var) + local ret; + repeat ret = pack(f(s, var)); + var = ret[1]; + until var == nil or filter(unpack(ret, 1, ret.n)); + return unpack(ret, 1, ret.n); + end, s, var; end local function _ripairs_iter(t, key) if key > 1 then return key-1, t[key-1]; end end