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

-- 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