mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2025-03-11 06:07:44 +01:00
77 lines
1.6 KiB
Lua
77 lines
1.6 KiB
Lua
-- Updates all values in t using values from to*.
|
|
function table.update(t, ...)
|
|
for _, to in ipairs {...} do
|
|
for k, v in pairs(to) do
|
|
t[k] = v
|
|
end
|
|
end
|
|
return t
|
|
end
|
|
|
|
-- Updates nil values in t using values from to*.
|
|
function table.update_nil(t, ...)
|
|
for _, to in ipairs {...} do
|
|
for k, v in pairs(to) do
|
|
if t[k] == nil then
|
|
t[k] = v
|
|
end
|
|
end
|
|
end
|
|
return t
|
|
end
|
|
|
|
---Works the same as `pairs`, but order returned by keys
|
|
---
|
|
---Taken from https://www.lua.org/pil/19.3.html
|
|
---@generic T: table, K, V, C
|
|
---@param t T
|
|
---@param f? fun(a: C, b: C):boolean
|
|
---@return fun():K, V
|
|
function table.pairs_by_keys(t, f)
|
|
local a = {}
|
|
for n in pairs(t) do table.insert(a, n) end
|
|
table.sort(a, f)
|
|
|
|
local i = 0 -- iterator variable
|
|
local function iter() -- iterator function
|
|
i = i + 1
|
|
if a[i] == nil then
|
|
return nil
|
|
else
|
|
return a[i], t[a[i]]
|
|
end
|
|
end
|
|
return iter
|
|
end
|
|
|
|
---@param a table
|
|
---@param b table
|
|
---@return table
|
|
function table.intersect(a, b)
|
|
local values_map = {}
|
|
|
|
for _,v in pairs(a) do values_map[v] = 1 end
|
|
|
|
-- Get all the values that are in both tables
|
|
local result = {}
|
|
for _,v in pairs(b) do
|
|
if values_map[v] then
|
|
result[#result + 1] = v
|
|
end
|
|
end
|
|
return result
|
|
end
|
|
|
|
-- Removes one element randomly selected from the array section of the table and
|
|
-- returns it, or nil if there are no elements in the array section of the table
|
|
function table.remove_random_element(table)
|
|
local count = #table
|
|
if count == 0 then return nil end
|
|
|
|
local idx = math.random(count)
|
|
local res = table[idx]
|
|
table[idx] = table[count]
|
|
table[count] = nil
|
|
count = count - 1
|
|
return res
|
|
end
|