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
3 years ago
|
--[=[
|
||
|
@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
|