+-- Return the first n items an iterator returns
+function it.head(n, f, s, var)
+ local c = 0;
+ return function (_s, _var)
+ if c >= n then
+ return nil;
+ end
+ c = c + 1;
+ return f(_s, _var);
+ end, s, var;
+end
+
+-- Skip the first n items an iterator returns
+function it.skip(n, f, s, var)
+ for _ = 1, n do
+ var = f(s, var);
+ end
+ return f, s, var;
+end
+
+-- Return the last n items an iterator returns
+function it.tail(n, f, s, var)
+ local results, count = {}, 0;
+ while true do
+ local ret = pack(f(s, var));
+ var = ret[1];
+ if var == nil then break; end
+ results[(count%n)+1] = ret;
+ count = count + 1;
+ end
+
+ if n > count then n = count; end
+
+ local pos = 0;
+ return function ()
+ pos = pos + 1;
+ if pos > n then return nil; end
+ local ret = results[((count-1+pos)%n)+1];
+ return unpack(ret, 1, ret.n);
+ end
+ --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
+function it.ripairs(t)
+ return _ripairs_iter, t, #t+1;
+end
+
+local function _range_iter(max, curr) if curr < max then return curr + 1; end end
+function it.range(x, y)
+ if not y then x, y = 1, x; end -- Default to 1..x if y not given
+ return _range_iter, y, x-1;
+end
+