do
local function lookup_memoized (val, memoized)
if memoized[val] == nil then
if type(val) == "table" then
memoized[val] = {}
memoizing_deepcopy (val, memoized, memoized[val])
else
return val
end
end
return memoized[val]
end
function memoizing_deepcopy (src, memoized, res)
local memoized = memoized or {}
local res = res or {}
for k, v in pairs(src) do
if k ~= memoizing_deepcopy and v ~= memoizing_deepcopy then
local nk = lookup_memoized (k, memoized)
local nv = lookup_memoized (v, memoized)
res[nk] = nv
end
end
return res
end
end