You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
979 B
Lua
54 lines
979 B
Lua
--[=[
|
|
@c TableIterable x Iterable
|
|
@mt mem
|
|
@d Iterable class that wraps a basic Lua table, where order is not guaranteed.
|
|
Some versions may use a map function to shape the objects before they are accessed.
|
|
]=]
|
|
|
|
local Iterable = require('iterables/Iterable')
|
|
|
|
local TableIterable = require('class')('TableIterable', Iterable)
|
|
|
|
function TableIterable:__init(tbl, map)
|
|
self._tbl = tbl
|
|
self._map = map
|
|
end
|
|
|
|
--[=[
|
|
@m iter
|
|
@r function
|
|
@d Returns an iterator that returns all contained objects. The order of the objects is not guaranteed.
|
|
]=]
|
|
function TableIterable:iter()
|
|
local tbl = self._tbl
|
|
if not tbl then
|
|
return function()
|
|
return nil
|
|
end
|
|
end
|
|
local map = self._map
|
|
if map then
|
|
local k, v
|
|
return function()
|
|
while true do
|
|
k, v = next(tbl, k)
|
|
if not v then
|
|
return nil
|
|
end
|
|
v = map(v)
|
|
if v then
|
|
return v
|
|
end
|
|
end
|
|
end
|
|
else
|
|
local k, v
|
|
return function()
|
|
k, v = next(tbl, k)
|
|
return v
|
|
end
|
|
end
|
|
end
|
|
|
|
return TableIterable
|