diff options
| author | Christian Chiarulli <[email protected]> | 2022-10-03 00:56:23 +0000 | 
|---|---|---|
| committer | GitHub <[email protected]> | 2022-10-03 00:56:23 +0000 | 
| commit | 1c03ac80529d90c7a824a581172b6e41e6ae237b (patch) | |
| tree | bbcee88ef07eda8658e4907c8a511625aa26a9bf /lua/lvim/utils | |
| parent | 488d95b3b84879a178692557cb7a9c683bc8c36b (diff) | |
feat: reload and lir color update (#3123)
Diffstat (limited to 'lua/lvim/utils')
| -rw-r--r-- | lua/lvim/utils/reload.lua | 80 | 
1 files changed, 80 insertions, 0 deletions
| diff --git a/lua/lvim/utils/reload.lua b/lua/lvim/utils/reload.lua new file mode 100644 index 00000000..46392349 --- /dev/null +++ b/lua/lvim/utils/reload.lua @@ -0,0 +1,80 @@ +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 +-- 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 +        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 +  end +end + +M.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 old +end + +return M | 
