Groovy deep clone and recursive map merge
Groovy
def deepClone(Object value) {
if (value instanceof Map) return value.collectEntries { k, v -> [(k): deepClone(v)] }
if (value instanceof List) return value.collect { deepClone(it) }
value
}
def deepMerge(Map base, Map patch) {
Map out = deepClone(base) as Map
patch.each { k, v ->
out[k] = (v instanceof Map && out[k] instanceof Map) ? deepMerge(out[k] as Map, v as Map) : deepClone(v)
}
out
}
def original = [db: [host: 'localhost', port: 5432], tags: ['x']]
def merged = deepMerge(original, [db: [port: 6543], tags: ['y']])
println merged
println original