35 lines
765 B
Lua
35 lines
765 B
Lua
LC={}
|
|
LC.__index = LC
|
|
|
|
function LC:new(o)
|
|
o = o or {}
|
|
setmetatable(o, self)
|
|
return o
|
|
end
|
|
|
|
function LC:add_iter(func)
|
|
local prev_iter = self.iter
|
|
self.iter = coroutine.wrap(
|
|
(prev_iter == nil) and (function() func{} end)
|
|
or (function() for arg in prev_iter do func(arg) end end))
|
|
return self
|
|
end
|
|
|
|
function maybe_call(maybe_func, arg)
|
|
if type(maybe_func) == "function" then return maybe_func(arg) end
|
|
return maybe_func
|
|
end
|
|
|
|
function LC:range(key, first, last)
|
|
return self:add_iter(function(arg)
|
|
for value=maybe_call(first, arg), maybe_call(last, arg) do
|
|
arg[key] = value
|
|
coroutine.yield(arg)
|
|
end
|
|
end)
|
|
end
|
|
|
|
function LC:where(pred)
|
|
return self:add_iter(function(arg) if pred(arg) then coroutine.yield(arg) end end)
|
|
end
|