@@ -213,8 +213,9 @@ function mesecon.cmpAny(t1, t2)
213213 return true
214214end
215215
216- -- does not overwrite values; number keys (ipairs) are appended, not overwritten
216+ -- Deprecated. Use `merge_tables` or `merge_rule_sets` as appropriate.
217217function 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
228229end
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+
230257function 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 )
0 commit comments