aboutsummaryrefslogtreecommitdiffstats
path: root/lua/nvim-lsp-installer/data.lua
blob: 264fda80f107834849389502a93f84d21be8f017 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
local Data = {}

---@generic T : string
---@param values T[]
---@return table<T, T>
function Data.enum(values)
    local result = {}
    for i = 1, #values do
        local v = values[i]
        result[v] = v
    end
    return result
end

---@generic T
---@param list T[]
---@return table<T, boolean>
function Data.set_of(list)
    local set = {}
    for i = 1, #list do
        set[list[i]] = true
    end
    return set
end

---@generic T
---@param list T[]
---@return T[]
function Data.list_reverse(list)
    local result = {}
    for i = #list, 1, -1 do
        result[#result + 1] = list[i]
    end
    return result
end

---@generic T, U
---@param fn fun(item: T): U
---@param list T[]
---@return U[]
function Data.list_map(fn, list)
    local result = {}
    for i = 1, #list do
        result[#result + 1] = fn(list[i], i)
    end
    return result
end

function Data.table_pack(...)
    return { n = select("#", ...), ... }
end

function Data.list_not_nil(...)
    local result = {}
    local args = Data.table_pack(...)
    for i = 1, args.n do
        if args[i] ~= nil then
            result[#result + 1] = args[i]
        end
    end
    return result
end

function Data.tbl_pack(...)
    return { n = select("#", ...), ... }
end

function Data.when(condition, value)
    return condition and value or nil
end

function Data.lazy_when(condition, fn)
    return condition and fn() or nil
end

function Data.coalesce(...)
    local args = Data.tbl_pack(...)
    for i = 1, args.n do
        local variable = args[i]
        if variable ~= nil then
            return variable
        end
    end
end

---@generic T
---@param list T[]
---@return T[] @A shallow copy of the list.
function Data.list_copy(list)
    local result = {}
    for i = 1, #list do
        result[#result + 1] = list[i]
    end
    return result
end

---@generic T
---@param list T[]
---@param predicate fun(item: T): boolean
---@return T | nil
function Data.list_find_first(list, predicate)
    local result
    for i = 1, #list do
        local entry = list[i]
        if predicate(entry) then
            return entry
        end
    end
    return result
end

---@generic T
---@param list T[]
---@param predicate fun(item: T): boolean
---@return boolean
function Data.list_any(list, predicate)
    for i = 1, #list do
        if predicate(list[i]) then
            return true
        end
    end
    return false
end

---@generic T : fun(...)
---@param fn T
---@param cache_key_generator fun(...): string | nil
---@return T
function Data.memoize(fn, cache_key_generator)
    cache_key_generator = cache_key_generator or function(a)
        return a
    end
    local cache = {}
    return function(...)
        local key = cache_key_generator(...)
        if not cache[key] then
            cache[key] = fn(...)
        end
        return cache[key]
    end
end

function Data.lazy(fn)
    local ret_val
    return function()
        if not ret_val then
            ret_val = Data.table_pack(fn())
        end
        return unpack(ret_val, 1, ret_val.n)
    end
end

return Data