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