| 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
 
- -- end
 
- local 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]
 
- end
 
- local 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
 
-   end
 
- end
 
- M.require_clean = function(m)
 
-   package.loaded[m] = nil
 
-   _G[m] = nil
 
-   local _, module = pcall(require, m)
 
-   return module
 
- end
 
- M.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 module
 
- end
 
- M.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 old
 
- end
 
- -- 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,
 
-   })
 
- end
 
- return M
 
 
  |