| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 | local M = {}local Log = require "lvim.core.log"-- 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        Log:debug(          string.format("Reloader: mismatch between old [%s] and new [%s] type for [%s]", type(old[k]), type(new[k]), 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.require_clean = function(m)  package.loaded[m] = nil  _G[m] = nil  local _, module = pcall(require, m)  return moduleendM.require_safe = function(mod)  local status_ok, module = pcall(require, mod)  if not status_ok then    local trace = debug.getinfo(2, "SL")    local shorter_src = trace.short_src    local lineinfo = shorter_src .. ":" .. (trace.currentline or trace.linedefined)    local msg = string.format("%s : skipped loading [%s]", lineinfo, mod)    Log:debug(msg)  end  return moduleendM.reload = function(mod)  if not package.loaded[mod] then    return M.require_safe(mod)  end  local old = package.loaded[mod]  package.loaded[mod] = nil  local new = M.require_safe(mod)  if type(old) == "table" and type(new) == "table" then    local repeat_tbl = {}    _replace(old, new, repeat_tbl)  end  package.loaded[mod] = old  return oldend-- code from <https://github.com/tjdevries/lazy-require.nvim/blob/bb626818ebc175b8c595846925fd96902b1ce02b/lua/lazy-require.lua#L25>function M.require_on_index(require_path)  return setmetatable({}, {    __index = function(_, key)      return require(require_path)[key]    end,    __newindex = function(_, key, value)      require(require_path)[key] = value    end,  })end-- code from <https://github.com/tjdevries/lazy-require.nvim/blob/bb626818ebc175b8c595846925fd96902b1ce02b/lua/lazy-require.lua#L25>function M.require_on_exported_call(require_path)  return setmetatable({}, {    __index = function(_, k)      return function(...)        return require(require_path)[k](...)      end    end,  })endreturn M
 |