summaryrefslogtreecommitdiff
path: root/script/vm/label.lua
diff options
context:
space:
mode:
Diffstat (limited to 'script/vm/label.lua')
-rw-r--r--script/vm/label.lua75
1 files changed, 75 insertions, 0 deletions
diff --git a/script/vm/label.lua b/script/vm/label.lua
new file mode 100644
index 00000000..c0e0dfb8
--- /dev/null
+++ b/script/vm/label.lua
@@ -0,0 +1,75 @@
+local listMgr = require 'vm.list'
+
+local Sort = 0
+
+local mt = {}
+mt.__index = mt
+mt.type = 'label'
+
+function mt:getName()
+ return self.name
+end
+
+function mt:addInfo(tp, source)
+ if not source then
+ error('No source')
+ end
+ local id = source.id
+ if not id then
+ error('Not instanted source')
+ end
+ if self._info[id] then
+ return
+ end
+ Sort = Sort + 1
+ local info = {
+ type = tp,
+ source = id,
+ _sort = Sort,
+ }
+
+ self._info[id] = info
+end
+
+function mt:eachInfo(callback)
+ local list = {}
+ for srcId, info in pairs(self._info) do
+ local src = listMgr.get(srcId)
+ if src then
+ list[#list+1] = info
+ else
+ self._info[srcId] = nil
+ end
+ end
+ table.sort(list, function (a, b)
+ return a._sort < b._sort
+ end)
+ for i = 1, #list do
+ local info = list[i]
+ local res = callback(info, listMgr.get(info.source))
+ if res ~= nil then
+ return res
+ end
+ end
+ return nil
+end
+
+function mt:getSource()
+ return listMgr.get(self.source)
+end
+
+return function (name, source)
+ if not source then
+ error('No source')
+ end
+ local id = source.id
+ if not id then
+ error('Not instanted source')
+ end
+ local self = setmetatable({
+ name = name,
+ source = id,
+ _info = {},
+ }, mt)
+ return self
+end