-- lua/lib/utils.lua require("lua.lib.globals") local M = {} local function is_table(x) return type(x) == "table" end local function is_list(t) if type(t) ~= "table" then return false end local n = 0 for k, _ in pairs(t) do if type(k) ~= "number" then return false end if k > n then n = k end end for i = 1, n do if t[i] == nil then return false end end return true end function M.list_extend(dst, src) for _, value in ipairs(src) do table.insert(dst, value) end return dst end local function deepcopy(value, seen) if type(value) ~= "table" then return value end seen = seen or {} if seen[value] then return seen[value] end local result = {} seen[value] = result for k, v in pairs(value) do result[deepcopy(k, seen)] = deepcopy(v, seen) end return result end function M.tbl_recursive_merge(defaults, overrides) local result = deepcopy(defaults) if not is_table(overrides) then return result end for key, value in pairs(overrides) do if is_table(value) and is_table(result[key]) then result[key] = M.tbl_recursive_merge(result[key], value) else result[key] = deepcopy(value) end end return result end function M.extend_config(defaults, user_module) local file = HYPR .. "/" .. string.gsub(user_module, "%.", "/") .. ".lua" if not M.is_file_exists(file) then print(file .. " not found.") return deepcopy(defaults) end local ok, overrides = pcall(require, user_module) if not ok then return deepcopy(defaults) end if type(overrides) ~= "table" then return deepcopy(defaults) end return M.tbl_recursive_merge(defaults, overrides) end function M.is_file_exists(name) local f = io.open(name, "r") if f ~= nil then io.close(f) return true else return false end end function M.exec_if_file_extes(file) if M.is_file_exists(file) then hl.exec_cmd(file) else hl.notification.create({ file .. " doesn't extist", 5000, 0 }) end end function M.create_if_not_exists(path) if not M.is_file_exists(path) then os.execute('mkdir -pv "$(dirname "' .. path .. '")"') os.execute("touch " .. path) return true end return false end function M.shell_quote(s) return "'" .. tostring(s):gsub("'", "'\\''") .. "'" end function M.command_success(cmd) local ok = os.execute(cmd) return ok == true or ok == 0 end return M