mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-01-24 09:40:06 +08:00
60 lines
1.3 KiB
Lua
Vendored
60 lines
1.3 KiB
Lua
Vendored
local validate = vim.validate
|
|
|
|
--- Wrapper class to interact with vim lists
|
|
--- @class List
|
|
|
|
local list_methods = {
|
|
--- @param self List
|
|
--- @param item any
|
|
add = table.insert,
|
|
|
|
--- @param self List
|
|
--- @param item any
|
|
--- @param position number
|
|
insert = function(self, item, position)
|
|
if position then
|
|
if position > #self then position = #self end
|
|
if position < 0 then position = 0 end
|
|
table.insert(self, position + 1, item)
|
|
else
|
|
table.insert(self, 1, item)
|
|
end
|
|
end,
|
|
}
|
|
|
|
local list_mt = {
|
|
__index = list_methods,
|
|
__newindex = function(list, key, value)
|
|
if type(key) == 'number' then rawset(list, key, value) end
|
|
end,
|
|
__call = function(list)
|
|
local index = 0
|
|
local length = #list
|
|
local function list_iter()
|
|
if index == length then return end
|
|
index = index + 1
|
|
return list[index]
|
|
end
|
|
return list_iter, list, nil
|
|
end,
|
|
_vim_type = 'list',
|
|
}
|
|
|
|
--- @param tbl table
|
|
--- @return List
|
|
function List(tbl)
|
|
validate {
|
|
tbl = {tbl, 'table', true}
|
|
}
|
|
|
|
local list = {}
|
|
if tbl then
|
|
for _, v in ipairs(tbl) do
|
|
table.insert(list, v)
|
|
end
|
|
end
|
|
return setmetatable(list, list_mt)
|
|
end
|
|
|
|
return List
|