diff options
Diffstat (limited to 'lua/blink/cmp/lib/utils.lua')
| -rw-r--r-- | lua/blink/cmp/lib/utils.lua | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/lua/blink/cmp/lib/utils.lua b/lua/blink/cmp/lib/utils.lua new file mode 100644 index 0000000..84bcc3d --- /dev/null +++ b/lua/blink/cmp/lib/utils.lua @@ -0,0 +1,112 @@ +local utils = {} + +--- Shallow copy table +--- @generic T +--- @param t T +--- @return T +function utils.shallow_copy(t) + local t2 = {} + for k, v in pairs(t) do + t2[k] = v + end + return t2 +end + +--- Returns the union of the keys of two tables +--- @generic T +--- @param t1 T[] +--- @param t2 T[] +--- @return T[] +function utils.union_keys(t1, t2) + local t3 = {} + for k, _ in pairs(t1) do + t3[k] = true + end + for k, _ in pairs(t2) do + t3[k] = true + end + return vim.tbl_keys(t3) +end + +--- Returns a list of unique values from the input array +--- @generic T +--- @param arr T[] +--- @return T[] +function utils.deduplicate(arr) + local hash = {} + for _, v in ipairs(arr) do + hash[v] = true + end + return vim.tbl_keys(hash) +end + +function utils.schedule_if_needed(fn) + if vim.in_fast_event() then + vim.schedule(fn) + else + fn() + end +end + +--- Flattens an arbitrarily deep table into a single level table +--- @param t table +--- @return table +function utils.flatten(t) + if t[1] == nil then return t end + + local flattened = {} + for _, v in ipairs(t) do + if type(v) == 'table' and vim.tbl_isempty(v) then goto continue end + + if v[1] == nil then + table.insert(flattened, v) + else + vim.list_extend(flattened, utils.flatten(v)) + end + + ::continue:: + end + return flattened +end + +--- Returns the index of the first occurrence of the value in the array +--- @generic T +--- @param arr T[] +--- @param val T +--- @return number? +function utils.index_of(arr, val) + for idx, v in ipairs(arr) do + if v == val then return idx end + end + return nil +end + +--- Finds an item in an array using a predicate function +--- @generic T +--- @param arr T[] +--- @param predicate fun(item: T): boolean +--- @return number? +function utils.find_idx(arr, predicate) + for idx, v in ipairs(arr) do + if predicate(v) then return idx end + end + return nil +end + +--- Slices an array +--- @generic T +--- @param arr T[] +--- @param start number? +--- @param finish number? +--- @return T[] +function utils.slice(arr, start, finish) + start = start or 1 + finish = finish or #arr + local sliced = {} + for i = start, finish do + sliced[#sliced + 1] = arr[i] + end + return sliced +end + +return utils |
