mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
perf(lua): optimize vim.deep_equal #15236
By remembering the keys already compared in repeating a comparison is avoided. Thanks: https://stackoverflow.com/a/32660766
This commit is contained in:
parent
3b3dbcf7b7
commit
4b452d4efb
@ -1268,7 +1268,17 @@ schedule_wrap({cb}) *vim.schedule_wrap()*
|
|||||||
|
|
||||||
|
|
||||||
deep_equal({a}, {b}) *vim.deep_equal()*
|
deep_equal({a}, {b}) *vim.deep_equal()*
|
||||||
TODO: Documentation
|
Deep compare values for equality
|
||||||
|
|
||||||
|
Tables are compared recursively unless they both provide the `eq` methamethod.
|
||||||
|
All other types are compared using the equality `==` operator.
|
||||||
|
|
||||||
|
Parameters: ~
|
||||||
|
{a} first value
|
||||||
|
{b} second value
|
||||||
|
|
||||||
|
Return: ~
|
||||||
|
`true` if values are equals, else `false` .
|
||||||
|
|
||||||
deepcopy({orig}) *vim.deepcopy()*
|
deepcopy({orig}) *vim.deepcopy()*
|
||||||
Returns a deep copy of the given object. Non-table objects are
|
Returns a deep copy of the given object. Non-table objects are
|
||||||
|
@ -267,18 +267,23 @@ function vim.tbl_deep_extend(behavior, ...)
|
|||||||
end
|
end
|
||||||
|
|
||||||
--- Deep compare values for equality
|
--- Deep compare values for equality
|
||||||
|
---
|
||||||
|
--- Tables are compared recursively unless they both provide the `eq` methamethod.
|
||||||
|
--- All other types are compared using the equality `==` operator.
|
||||||
|
---@param a first value
|
||||||
|
---@param b second value
|
||||||
|
---@returns `true` if values are equals, else `false`.
|
||||||
function vim.deep_equal(a, b)
|
function vim.deep_equal(a, b)
|
||||||
if a == b then return true end
|
if a == b then return true end
|
||||||
if type(a) ~= type(b) then return false end
|
if type(a) ~= type(b) then return false end
|
||||||
if type(a) == 'table' then
|
if type(a) == 'table' then
|
||||||
-- TODO improve this algorithm's performance.
|
|
||||||
for k, v in pairs(a) do
|
for k, v in pairs(a) do
|
||||||
if not vim.deep_equal(v, b[k]) then
|
if not vim.deep_equal(v, b[k]) then
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
for k, v in pairs(b) do
|
for k, _ in pairs(b) do
|
||||||
if not vim.deep_equal(v, a[k]) then
|
if a[k] == nil then
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user