96 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.merge(table1, table2)
local newTable = table.deepcopy(table1)
for k, v in pairs(table2) do
newTable[k] = v
end
return newTable
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