Skip to content

Commit 583d2c1

Browse files
authored
Replace mesecon.mergetable (#533)
1 parent 397d449 commit 583d2c1

File tree

4 files changed

+35
-8
lines changed

4 files changed

+35
-8
lines changed

mesecons/internal.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@ function mesecon.get_any_inputrules(node)
9292
end
9393

9494
function mesecon.get_any_rules(node)
95-
return mesecon.mergetable(mesecon.get_any_inputrules(node) or {},
96-
mesecon.get_any_outputrules(node) or {})
95+
return mesecon.merge_rule_sets(mesecon.get_any_inputrules(node),
96+
mesecon.get_any_outputrules(node))
9797
end
9898

9999
-- Receptors

mesecons/presets.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ mesecon.rules.default = {
1616
{x = 0, y = -1, z = -1},
1717
}
1818

19-
mesecon.rules.floor = mesecon.mergetable(mesecon.rules.default, {{x = 0, y = -1, z = 0}})
19+
mesecon.rules.floor = mesecon.merge_rule_sets(mesecon.rules.default, {{x = 0, y = -1, z = 0}})
2020

21-
mesecon.rules.pplate = mesecon.mergetable(mesecon.rules.floor, {{x = 0, y = -2, z = 0}})
21+
mesecon.rules.pplate = mesecon.merge_rule_sets(mesecon.rules.floor, {{x = 0, y = -2, z = 0}})
2222

2323
mesecon.rules.buttonlike = {
2424
{x = 1, y = 0, z = 0},

mesecons/util.lua

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -213,8 +213,9 @@ function mesecon.cmpAny(t1, t2)
213213
return true
214214
end
215215

216-
-- does not overwrite values; number keys (ipairs) are appended, not overwritten
216+
-- Deprecated. Use `merge_tables` or `merge_rule_sets` as appropriate.
217217
function mesecon.mergetable(source, dest)
218+
minetest.log("warning", debug.traceback("Deprecated call to mesecon.mergetable"))
218219
local rval = mesecon.tablecopy(dest)
219220

220221
for k, v in pairs(source) do
@@ -227,15 +228,41 @@ function mesecon.mergetable(source, dest)
227228
return rval
228229
end
229230

231+
-- Merges several rule sets in one. Order may not be preserved. Nil arguments
232+
-- are ignored.
233+
-- The rule sets must be of the same kind (either all single-level or all two-level).
234+
-- The function may be changed to normalize the resulting set in some way.
235+
function mesecon.merge_rule_sets(...)
236+
local rval = {}
237+
for _, t in pairs({...}) do -- ignores nils automatically
238+
table.insert_all(rval, mesecon.tablecopy(t))
239+
end
240+
return rval
241+
end
242+
243+
-- Merges two tables, with entries from `replacements` taking precedence over
244+
-- those from `base`. Returns the new table.
245+
-- Values are deep-copied from either table, keys are referenced.
246+
-- Numerical indices aren’t handled specially.
247+
function mesecon.merge_tables(base, replacements)
248+
local ret = mesecon.tablecopy(replacements) -- these are never overriden so have to be copied in any case
249+
for k, v in pairs(base) do
250+
if ret[k] == nil then -- it could be `false`
251+
ret[k] = mesecon.tablecopy(v)
252+
end
253+
end
254+
return ret
255+
end
256+
230257
function mesecon.register_node(name, spec_common, spec_off, spec_on)
231258
spec_common.drop = spec_common.drop or name .. "_off"
232259
spec_common.on_blast = spec_common.on_blast or mesecon.on_blastnode
233260
spec_common.__mesecon_basename = name
234261
spec_on.__mesecon_state = "on"
235262
spec_off.__mesecon_state = "off"
236263

237-
spec_on = mesecon.mergetable(spec_common, spec_on);
238-
spec_off = mesecon.mergetable(spec_common, spec_off);
264+
spec_on = mesecon.merge_tables(spec_common, spec_on);
265+
spec_off = mesecon.merge_tables(spec_common, spec_off);
239266

240267
minetest.register_node(name .. "_on", spec_on)
241268
minetest.register_node(name .. "_off", spec_off)

mesecons_extrawires/mesewire.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ minetest.override_item("default:mese", {
1818

1919
-- Copy node definition of powered mese from normal mese
2020
-- and brighten texture tiles to indicate mese is powered
21-
local powered_def = mesecon.mergetable(minetest.registered_nodes["default:mese"], {
21+
local powered_def = mesecon.merge_tables(minetest.registered_nodes["default:mese"], {
2222
drop = "default:mese",
2323
light_source = 5,
2424
mesecons = {conductor = {

0 commit comments

Comments
 (0)