local M = {} --- Capture `fn`'s upvalues and pass to `delegate` ---@param delegate fun(env: table, _: ...): ... ---@param fn function ---@return fun(...): ... function M.new(delegate, fn) local upvalues = {} for i = 1, debug.getinfo(fn, "u").nups do local name, value = debug.getupvalue(fn, i) upvalues[name] = value end return function(...) return delegate(upvalues, ...) end end return setmetatable(M, { __call = function(_, ...) return M.new(...) end, })