dungeon/data/util.lua
2018-03-26 22:16:10 +02:00

50 lines
1.4 KiB
Lua

local util = {}
function util.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[deepcopy(orig_key)] = deepcopy(orig_value)
end
setmetatable(copy, deepcopy(getmetatable(orig)))
else -- number, string, boolean, etc
copy = orig
end
return copy
end
function util.merge(bot, top)
local p_type = type(parent)
local c_type = type(child)
assert(p_type == 'table', 'expected table, found '..p_type..' instead.')
assert(c_type == 'table', 'expected table, found '..c_type..' instead.')
for k,v in pairs(top) do
if type(k) == 'number' and type(bot[1]) ~= nil and type(top[1]) ~= nil then
table.insert(bot, v)
elseif type(v) == 'table' then
if type(bot[k]) == 'table' then
merge(bot[k], v)
else
bot[k] = v
end
else
bot[k] = v
end
end
end
function util.inherit(parent, child)
local p_type = type(parent)
local c_type = type(child)
assert(p_type == 'table', 'expected table, found '..p_type..' instead.')
assert(c_type == 'table', 'expected table, found '..c_type..' instead.')
local result = util.deepcopy(parent)
merge(result, child)
return result
end