84 lines
1.2 KiB
Lua
84 lines
1.2 KiB
Lua
local LinkedList = {}
|
|
LinkedList.__index = LinkedList
|
|
|
|
function LinkedList:Add(data)
|
|
local node = {}
|
|
node.data = data
|
|
node.id = tostring(node):sub(8)
|
|
|
|
local back = self.back
|
|
if back then
|
|
back.next = node
|
|
node.prev = back
|
|
end
|
|
|
|
if not self.front then
|
|
self.front = node
|
|
end
|
|
|
|
self.back = node
|
|
self.size = self.size + 1
|
|
|
|
self.nodes[node.id] = node
|
|
self.lookup[data] = node
|
|
|
|
return node.id
|
|
end
|
|
|
|
function LinkedList:Get(id)
|
|
local node = self.nodes[id]
|
|
if node then
|
|
return node.data
|
|
end
|
|
end
|
|
|
|
function LinkedList:Remove(id)
|
|
local node = self.nodes[id]
|
|
|
|
if node then
|
|
if node.prev then
|
|
node.prev.next = node.next
|
|
end
|
|
|
|
if node.next then
|
|
node.next.prev = node.prev
|
|
end
|
|
|
|
if node == self.front then
|
|
self.front = node.next
|
|
end
|
|
|
|
if node == self.back then
|
|
self.back = node.prev
|
|
end
|
|
|
|
if node.data then
|
|
node.data = nil
|
|
end
|
|
|
|
self.size = self.size - 1
|
|
end
|
|
end
|
|
|
|
function LinkedList:GetEnumerator()
|
|
return coroutine.wrap(function ()
|
|
local node = self.front
|
|
while node ~= nil do
|
|
coroutine.yield(node.id, node.data)
|
|
node = node.next
|
|
end
|
|
end)
|
|
end
|
|
|
|
function LinkedList.new()
|
|
local list =
|
|
{
|
|
nodes = {};
|
|
lookup = {};
|
|
size = 0;
|
|
}
|
|
|
|
return setmetatable(list, LinkedList)
|
|
end
|
|
|
|
return LinkedList |