diff options
Diffstat (limited to 'lua/telescope/_compat.lua')
| -rw-r--r-- | lua/telescope/_compat.lua | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/lua/telescope/_compat.lua b/lua/telescope/_compat.lua new file mode 100644 index 0000000..3d280ef --- /dev/null +++ b/lua/telescope/_compat.lua @@ -0,0 +1,71 @@ + +vim.deepcopy = (function() + local function _id(v) + return v + end + + local deepcopy_funcs = { + table = function(orig) + local copy = {} + + if vim._empty_dict_mt ~= nil and getmetatable(orig) == vim._empty_dict_mt then + copy = vim.empty_dict() + end + + for k, v in pairs(orig) do + copy[vim.deepcopy(k)] = vim.deepcopy(v) + end + + if getmetatable(orig) then + setmetatable(copy, getmetatable(orig)) + end + + return copy + end, + ['function'] = _id or function(orig) + local ok, dumped = pcall(string.dump, orig) + if not ok then + error(debug.traceback(dumped)) + end + + local cloned = loadstring(dumped) + local i = 1 + while true do + local name = debug.getupvalue(orig, i) + if not name then + break + end + debug.upvaluejoin(cloned, i, orig, i) + i = i + 1 + end + return cloned + end, + number = _id, + string = _id, + ['nil'] = _id, + boolean = _id, + } + + return function(orig) + local f = deepcopy_funcs[type(orig)] + if f then + return f(orig) + else + error("Cannot deepcopy object of type "..type(orig)) + end + end +end)() + + + +table.clear = table.clear or function(t) + for k in pairs (t) do + t[k] = nil + end +end + +table.pop = table.pop or function(t, k) + local val = t[k] + t[k] = nil + return val +end |
