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.
85 lines
1.9 KiB
Lua
85 lines
1.9 KiB
Lua
-- https://github.com/LuaDist-testing/ltdiff
|
|
|
|
local ltdiff = {}
|
|
|
|
local function table_diff(A, B)
|
|
local diff = {
|
|
del = {},
|
|
mod = {},
|
|
sub = {},
|
|
}
|
|
|
|
for k, v in pairs(A) do
|
|
if type(A[k]) == "function" or type(A[k]) == "userdata" then
|
|
error("table_diff only supports diffs of tables!")
|
|
elseif B[k] ~= nil and type(A[k]) == "table" and type(B[k]) == "table" then
|
|
diff.sub[k] = table_diff(A[k], B[k])
|
|
|
|
if next(diff.sub[k]) == nil then
|
|
diff.sub[k] = nil
|
|
end
|
|
elseif B[k] == nil then
|
|
diff.del[#(diff.del) + 1] = k
|
|
elseif B[k] ~= v then
|
|
diff.mod[k] = B[k]
|
|
end
|
|
end
|
|
|
|
for k, v in pairs(B) do
|
|
if type(B[k]) == "function" or type(B[k]) == "userdata" then
|
|
error("table_diff only supports diffs of tables!")
|
|
elseif diff.sub[k] ~= nil then
|
|
-- skip
|
|
elseif A[k] ~= nil and type(A[k]) == "table" and type(B[k]) == "table" then
|
|
diff.sub[k] = table_diff(B[k], A[k])
|
|
|
|
if next(diff.sub[k]) == nil then
|
|
diff.sub[k] = nil
|
|
end
|
|
elseif B[k] ~= A[k] then
|
|
diff.mod[k] = v
|
|
end
|
|
end
|
|
|
|
if next(diff.sub) == nil then
|
|
diff.sub = nil
|
|
end
|
|
|
|
if next(diff.mod) == nil then
|
|
diff.mod = nil
|
|
end
|
|
|
|
if next(diff.del) == nil then
|
|
diff.del = nil
|
|
end
|
|
|
|
return diff
|
|
end
|
|
|
|
local function table_patch(A, diff)
|
|
if diff.sub ~= nil then
|
|
for k, v in pairs(diff.sub) do
|
|
A[k] = table_patch(A[k], v)
|
|
end
|
|
end
|
|
|
|
if diff.del ~= nil then
|
|
for _, v in pairs(diff.del) do
|
|
A[v] = nil
|
|
end
|
|
end
|
|
|
|
if diff.mod ~= nil then
|
|
for k, v in pairs(diff.mod) do
|
|
A[k] = v
|
|
end
|
|
end
|
|
|
|
return A
|
|
end
|
|
|
|
ltdiff.diff = table_diff
|
|
ltdiff.patch = table_patch
|
|
|
|
return ltdiff
|