192 lines
3.2 KiB
Lua
192 lines
3.2 KiB
Lua
function table.copy(t)
|
|
local copied = {}
|
|
|
|
for k, v in pairs(t) do
|
|
copied[k] = v
|
|
end
|
|
|
|
return copied
|
|
end
|
|
|
|
function table.deep_copy(t)
|
|
local copied = {}
|
|
|
|
for k, v in pairs(t) do
|
|
if type(v) == "table" then
|
|
copied[k] = table.deep_copy(v)
|
|
else
|
|
copied[k] = v
|
|
end
|
|
end
|
|
|
|
return setmetatable(copied, getmetatable(t))
|
|
end
|
|
|
|
function table.count_pairs(t)
|
|
local count = 0
|
|
|
|
for k, v in pairs(t) do
|
|
count = count + 1
|
|
end
|
|
|
|
return count
|
|
end
|
|
|
|
function table.random(t)
|
|
return t[math.random(1, #t)]
|
|
end
|
|
|
|
function table.shuffle(t)
|
|
for i = #t, 2, -1 do
|
|
local j = math.random(i)
|
|
t[i], t[j] = t[j], t[i]
|
|
end
|
|
|
|
return t
|
|
end
|
|
|
|
function table.merge(t1, t2)
|
|
for i, v in pairs(t2) do
|
|
if type(i) == "number" then
|
|
t1[#t1 + 1] = v
|
|
elseif t1[i] == nil then
|
|
t1[i] = v
|
|
end
|
|
end
|
|
|
|
return t1
|
|
end
|
|
|
|
function table.map(t, func)
|
|
for i, v in pairs(t) do
|
|
t[i] = func(i, v)
|
|
end
|
|
|
|
return t
|
|
end
|
|
|
|
function table.filter(t, func)
|
|
|
|
for i = #t, 1, -1 do
|
|
if not func(i, t[i]) then
|
|
table.remove(t, i)
|
|
end
|
|
end
|
|
|
|
local size = #t
|
|
|
|
for i, v in pairs(t) do
|
|
local i_type = type(i)
|
|
if i_type == "number" then
|
|
if i < 1 or i > size then
|
|
if not func(i, v) then
|
|
t[i] = nil
|
|
end
|
|
end
|
|
else
|
|
if not func(i, v) then
|
|
t[i] = nil
|
|
end
|
|
end
|
|
end
|
|
|
|
return t
|
|
end
|
|
|
|
function table.set_default(t, key, default)
|
|
if t[key] == nil then
|
|
t[key] = default
|
|
return default
|
|
end
|
|
|
|
return t[key]
|
|
end
|
|
|
|
function table.flat(t)
|
|
local flat = {}
|
|
|
|
for _, v in pairs(t) do
|
|
if type(v) == "table" then
|
|
table.merge(flat, v)
|
|
else
|
|
table.insert(flat, v)
|
|
end
|
|
end
|
|
|
|
return flat
|
|
end
|
|
|
|
function table.deep_flat(t)
|
|
local flat = {}
|
|
|
|
for _, v in pairs(t) do
|
|
if type(v) == "table" then
|
|
table.merge(flat, table.deep_flat(v))
|
|
else
|
|
table.insert(flat, v)
|
|
end
|
|
end
|
|
|
|
return flat
|
|
end
|
|
|
|
function table.sub(arr, start, stop)
|
|
local res = {}
|
|
start = start or 1
|
|
stop = stop or #arr
|
|
|
|
for i = start, stop do
|
|
table.insert(res, arr[i])
|
|
end
|
|
|
|
return res
|
|
end
|
|
|
|
function table.has(t, x)
|
|
for i,v in ipairs(t) do
|
|
if v == x then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
function table.index(t, x)
|
|
for i,v in ipairs(t) do
|
|
if v == x then
|
|
return i
|
|
end
|
|
end
|
|
return -1
|
|
end
|
|
|
|
function table.remove_value(t, x)
|
|
local index = table.index(t, x)
|
|
if index ~= -1 then
|
|
table.remove(t, index)
|
|
end
|
|
end
|
|
|
|
function table.insert_unique(t, pos_or_val, val)
|
|
if table.has(t, val or pos_or_val) then
|
|
return
|
|
end
|
|
|
|
if val then
|
|
table.insert(t, pos_or_val, val)
|
|
else
|
|
table.insert(t, pos_or_val)
|
|
end
|
|
end
|
|
|
|
function table.tostring(t)
|
|
local s = '['
|
|
for i,v in ipairs(t) do
|
|
s = s..tostring(v)
|
|
if i < #t then
|
|
s = s..', '
|
|
end
|
|
end
|
|
return s..']'
|
|
end
|