| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 | local M = {}-- revisit this-- function prequire(package)--   local status, lib = pcall(require, package)--   if status then--     return lib--   else--     vim.notify("Failed to require '" .. package .. "' from " .. debug.getinfo(2).source)--     return nil--   end-- endlocal function _assign(old, new, k)  local otype = type(old[k])  local ntype = type(new[k])  -- print("hi")  if (otype == "thread" or otype == "userdata") or (ntype == "thread" or ntype == "userdata") then    vim.notify(string.format("warning: old or new attr %s type be thread or userdata", k))  end  old[k] = new[k]endlocal function _replace(old, new, repeat_tbl)  if repeat_tbl[old] then    return  end  repeat_tbl[old] = true  local dellist = {}  for k, _ in pairs(old) do    if not new[k] then      table.insert(dellist, k)    end  end  for _, v in ipairs(dellist) do    old[v] = nil  end  for k, _ in pairs(new) do    if not old[k] then      old[k] = new[k]    else      if type(old[k]) ~= type(new[k]) then        vim.notify(string.format("warning: attr %s old type no equal new type!!!", k))        _assign(old, new, k)      else        if type(old[k]) == "table" then          _replace(old[k], new[k], repeat_tbl)        else          _assign(old, new, k)        end      end    end  endendM.reload = function(mod)  if not package.loaded[mod] then    local m = require(mod)    return m  end  -- vim.notify "begin reload!!!"  local old = package.loaded[mod]  package.loaded[mod] = nil  local new = require(mod)  if type(old) == "table" and type(new) == "table" then    -- vim.notify "pick object in new module to old module!!!"    local repeat_tbl = {}    _replace(old, new, repeat_tbl)  end  package.loaded[mod] = old  -- vim.notify "finish reload!!!"  return oldendreturn M
 |