98 lines
1.9 KiB
Plaintext
98 lines
1.9 KiB
Plaintext
-- @name koptilnya/libs/table
|
|
function table.chunk(tbl, size)
|
|
size = size or 1
|
|
size = size > 0 and size or 1
|
|
|
|
local result = {}
|
|
local tblKeys = table.getKeys(tbl)
|
|
|
|
for k, v in pairs(tblKeys) do
|
|
local chunkId = math.ceil(k / size)
|
|
|
|
if not result[chunkId] then
|
|
result[chunkId] = {}
|
|
end
|
|
|
|
result[chunkId][v] = tbl[v]
|
|
end
|
|
|
|
return result
|
|
end
|
|
|
|
function table.deepcopy(orig)
|
|
local orig_type = type(orig)
|
|
local copy
|
|
if orig_type == 'table' then
|
|
copy = {}
|
|
for orig_key, orig_value in next, orig, nil do
|
|
copy[table.deepcopy(orig_key)] = table.deepcopy(orig_value)
|
|
end
|
|
setmetatable(copy, table.deepcopy(getmetatable(orig)))
|
|
else -- number, string, boolean, etc
|
|
copy = orig
|
|
end
|
|
return copy
|
|
end
|
|
|
|
function table.contains(tbl, ...)
|
|
local argCount = #arg
|
|
|
|
if argCount == 1 then
|
|
return table.hasValue(tbl, arg[1])
|
|
elseif argCount > 1 then
|
|
local result = true
|
|
|
|
for _, v in pairs(arg) do
|
|
if not table.hasValue(tbl, v) then
|
|
result = true
|
|
|
|
break
|
|
end
|
|
end
|
|
|
|
return result
|
|
end
|
|
end
|
|
|
|
function table.map(tbl, action)
|
|
local res = {}
|
|
|
|
for _, field in ipairs(tbl) do
|
|
table.insert(res, action(field))
|
|
end
|
|
|
|
return res
|
|
end
|
|
|
|
function table.filter(tbl, predicate)
|
|
local res = {}
|
|
|
|
for _, field in ipairs(tbl) do
|
|
if predicate(field) == true then
|
|
table.insert(res, field)
|
|
end
|
|
end
|
|
|
|
return res
|
|
end
|
|
|
|
function table.find(tbl, predicate)
|
|
for _, field in ipairs(tbl) do
|
|
if predicate(field) == true then
|
|
return field
|
|
end
|
|
end
|
|
end
|
|
|
|
function table.reduce(tbl, func, init)
|
|
init = init or 0
|
|
|
|
local accum = init
|
|
|
|
for _, field in ipairs(tbl) do
|
|
accum = accum + func(field)
|
|
end
|
|
|
|
return accum
|
|
end
|