47 lines
1008 B
Lua
47 lines
1008 B
Lua
array = {}
|
|
|
|
function array.find(arr, elem)
|
|
if type(elem) == 'function' then
|
|
for i,x in ipairs(arr) do
|
|
if elem(x) then
|
|
return i
|
|
end
|
|
end
|
|
else
|
|
for i,x in ipairs(arr) do
|
|
if x == elem then
|
|
return i
|
|
end
|
|
end
|
|
end
|
|
return nil
|
|
end
|
|
|
|
function array.any(arr, f)
|
|
for i,x in ipairs(arr) do
|
|
local result = f(x)
|
|
if result then
|
|
return result
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
-- like ipairs, but support an index to start iterating from
|
|
-- idx is inclusive; the first call to the iterator will return idx
|
|
function array.each(arr, idx)
|
|
if idx then
|
|
if type(idx) ~= 'number' then
|
|
error("argument #2 to 'array.each' must be an integer if provided")
|
|
end
|
|
assert(idx >= 1, ("can't start iterating over an array from %d; the starting index needs to be at least 1"):format(idx))
|
|
end
|
|
idx = idx and idx-1 or 0
|
|
local iter = ipairs(arr)
|
|
return function()
|
|
local elem
|
|
idx, elem = iter(arr, idx)
|
|
return idx, elem
|
|
end
|
|
end
|