From 969af089c8351d5356b1ed9f8208f0be9b4ee703 Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Thu, 20 Mar 2025 15:24:32 -0300 Subject: append numbered members when merging Overriding numbered members is not intuitive. Merging {1} and {2} should return {1,2} not {2}. --- util.lua | 23 +++++++++-------------- util_test.lua | 9 +++++++-- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/util.lua b/util.lua index 4aa7406..ab111f7 100644 --- a/util.lua +++ b/util.lua @@ -3,7 +3,7 @@ -- @author Florian Fischer -- @author git-bruh -- @license GPL-3 --- @copyright 2024 Florian Fischer +-- @copyright 2024-2025 Florian Fischer -- @copyright 2024 git-bruh local util = {} @@ -308,30 +308,25 @@ end --- Recursively merge two tables. -- This method modifies the weak table, if this is not intended make sure you -- use a deep copy of the weak table. --- The members of the strong table override members of the weak one. +-- Named members of the strong table override members of the weak one. +-- Numbered members get inserted into the weak table. -- @param weak table which's members are potentially overridden -- @param strong table which's members override ones from the weak table -- @return the merged table function util.table.merge(weak, strong) - -- merge named members for k, v in pairs(strong) do - -- potentially override the weak member if type(v) ~= 'table' then - weak[k] = v + if tonumber(k) then -- append numeric members + table.insert(weak, v) + else -- potentially override the weak member + weak[k] = v + end + else weak[k] = util.table.merge(weak[k] or {}, v) end end - -- merge numbered members - for i, v in ipairs(strong) do - -- potentially override the weak member - if type(v) ~= 'table' then - weak[i] = v - else - weak[i] = util.table.merge(weak[i] or {}, v) - end - end return weak end diff --git a/util_test.lua b/util_test.lua index 9f34d3c..c49b66e 100755 --- a/util_test.lua +++ b/util_test.lua @@ -42,11 +42,16 @@ function test_table_merge() -- luacheck: ignore 111 util.table.merge(t, t2) lunatest.assert_table(t) - lunatest.assert_len(2, t) + lunatest.assert_len(3, t) + + lunatest.assert_equal(1, t[1]) + lunatest.assert_equal(2, t[2]) + lunatest.assert_equal(3, t[3]) + lunatest.assert_table(t.foo) lunatest.assert_len(2, t.foo) - lunatest.assert_equal(t[1], t2[1]) + lunatest.assert_equal(t[3], t2[1]) lunatest.assert_equal(t[2], 2) lunatest.assert_equal(t.foo.bar.bar, 'bar') -- cgit v1.2.3