-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathStack.lua
94 lines (77 loc) · 1.92 KB
/
Stack.lua
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
--[[
Author: Miqueas Martinez (miqueas2020@yahoo.com)
Date: 2020/04/30
Git repository: https://github.com/Miqueas/Self
]]
local class = require("Self")
local unp = unpack or table.unpack
local Stack = class {
reg = { main = {} },
current = "main",
stacks = { "main" }
}
function Stack:new(...)
local args = {...}
if #args > 0 then
for _, v in ipairs(args) do
if type(v) == "string" then
self.reg[v] = {}
table.insert(self.stacks, v)
end
end
end
end
function Stack:push(...)
local args = {...}
if #args > 0 then
for _, v in ipairs(args) do
table.insert(self.reg[self.current], v)
end
end
end
function Stack:pop(pos)
table.remove(self.reg[self.current], pos)
end
function Stack:get(pos)
local last = self.reg[self.current][#self.reg[self.current]]
if pos then
return self.reg[self.current][pos]
end
return last
end
function Stack:switch(name)
assert(self.reg[name], ("Stack '%s' not exists"):format(name))
self.current = name
end
function Stack:name() return self.current end
function Stack:len() return #self.reg[self.current] end
function Stack:unpack() return unp(self.reg[self.current]) end
function Stack:create(name)
self.reg[name] = {}
table.insert(self.stacks, name)
end
function Stack:clear(name)
local name = name or self.current
assert(self.reg[name], ("Stack '%s' not exists"):format(name))
self.reg[name] = {}
end
function Stack:list() return unp(self.stacks) end
function Stack:index(val)
for i, v in ipairs(self.reg[self.current]) do
if v == val then
return i
end
end
end
function Stack:destroy(name)
local name = name or self.current
assert(self.reg[name], ("Stack '%s' not exists"):format(name))
assert(name ~= "main", "'main' stack can't be destroyed")
for i, v in ipairs(self.stacks) do
if v == name then
table.remove(self.stacks, i)
end
end
self.reg[name] = nil
end
return Stack