You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
40 lines
1.1 KiB
Lua
40 lines
1.1 KiB
Lua
--- Helper module for performing a deep copy.
|
|
-- @module lqc.helpers.deep_copy
|
|
-- @alias deep_copy
|
|
local pairs = pairs
|
|
local type = type
|
|
local setmetatable = setmetatable
|
|
local getmetatable = getmetatable
|
|
|
|
--- Deep copies an object recursively (including (nested) tables, metatables,
|
|
-- circular references, ...)
|
|
-- Heavily based on http://stackoverflow.com/questions/640642/how-do-you-copy-a-lua-table-by-value
|
|
-- @param obj Object to be copied
|
|
-- @param seen Table of previously seen objects (for handling circular references), default nil
|
|
-- @return deep copy of obj
|
|
local function deep_copy(obj, seen)
|
|
-- handle number, string, boolean, ...
|
|
if type(obj) ~= 'table' then
|
|
return obj
|
|
end
|
|
|
|
seen = seen or {}
|
|
if seen[obj] then
|
|
return seen[obj]
|
|
end -- handle circular references
|
|
|
|
-- handle table
|
|
local result = {}
|
|
seen[obj] = result
|
|
|
|
for key, value in pairs(obj) do
|
|
result[deep_copy(key, seen)] = deep_copy(value, seen)
|
|
end
|
|
|
|
-- handle metatable
|
|
return setmetatable(result, deep_copy(getmetatable(obj), seen))
|
|
end
|
|
|
|
return deep_copy
|
|
|