---@generic T ---@param tbl T ---@return T ---Creates a deep copy of a table, including all nested tables and their contents table.deepclone = function(tbl) tbl = table.clone(tbl) for k, v in pairs(tbl) do if type(v) == "table" then tbl[k] = table.deepclone(v) end end return tbl end ---@param tbl1 any ---@param tbl2 any ---@return boolean ---Compares if two values are equal, iterating over tables and matching both keys and values. table.matches = function(tbl1, tbl2) local type1, type2 = type(tbl1), type(tbl2) if type1 ~= type2 then return false end if type1 ~= 'table' and type2 ~= 'table' then return tbl1 == tbl2 end for k1, v1 in pairs(tbl1) do local v2 = tbl2[k1] if v2 == nil or not table.matches(v1, v2) then return false end end for k2, v2 in pairs(tbl2) do local v1 = tbl1[k2] if v1 == nil or not table.matches(v1, v2) then return false end end return true end ---@param tbl1 any ---@param tbl2 any ---@return boolean ---Checks if tbl1 contains the given values. table.contains = function(tbl1, tbl2) if type(tbl2) ~= 'table' then for _, v in pairs(tbl1) do if v == tbl2 then return true end end else local matched = 0 local values = 0 for _, v1 in pairs(tbl2) do values += 1 for _, v2 in pairs(tbl1) do if v1 == v2 then matched += 1 end end end if matched == values then return true end end return false end ---@param tbl1 any ---@param tbl2 any ---@return table ---Merges two tables together table.merge = function(tbl1, tbl2) for k, v in pairs(tbl2) do local type1 = type(tbl1[k]) local type2 = type(v) if type1 == 'table' and type2 == 'table' then table.merge(tbl1[k], v) elseif type1 == 'number' and type2 == 'number' then tbl1[k] += v else tbl1[k] = v end end return tbl1 end