Deep merge Lua tables without mutating sources

Lua
-- Recursively merge src into dst, copying nested tables instead of sharing.
local function deep_merge(dst, src)
    for key, value in pairs(src) do
        if type(value) == "table" then
            dst[key] = deep_merge(type(dst[key]) == "table" and dst[key] or {}, value)
        else
            dst[key] = value
        end
    end
    return dst
end

local base = { host = "localhost", retry = { count = 3, delay = 1 } }
local override = { retry = { delay = 5 }, verbose = true }

local config = deep_merge({}, base)
deep_merge(config, override)

print(config.host, config.retry.count, config.retry.delay, config.verbose)
print(base.retry.delay) -- still 1: base was not mutated