summaryrefslogtreecommitdiff
path: root/script/core/collector.lua
diff options
context:
space:
mode:
Diffstat (limited to 'script/core/collector.lua')
-rw-r--r--script/core/collector.lua188
1 files changed, 0 insertions, 188 deletions
diff --git a/script/core/collector.lua b/script/core/collector.lua
deleted file mode 100644
index a2e3ca08..00000000
--- a/script/core/collector.lua
+++ /dev/null
@@ -1,188 +0,0 @@
-local scope = require 'workspace.scope'
-
----@class collector
----@field subscribed table<uri, table<string, any>>
----@field collect table<string, table<uri, any>>
-local mt = {}
-mt.__index = mt
-
---- 订阅一个名字
----@param uri uri
----@param name string
----@param value any
-function mt:subscribe(uri, name, value)
- uri = uri or '<fallback>'
- -- 订阅部分
- local uriSubscribed = self.subscribed[uri]
- if not uriSubscribed then
- uriSubscribed = {}
- self.subscribed[uri] = uriSubscribed
- end
- uriSubscribed[name] = true
- -- 收集部分
- local nameCollect = self.collect[name]
- if not nameCollect then
- nameCollect = {}
- self.collect[name] = nameCollect
- end
- if value == nil then
- value = true
- end
- nameCollect[uri] = value
-end
-
---- 丢弃掉某个 uri 中收集的所有信息
----@param uri uri
-function mt:dropUri(uri)
- uri = uri or '<fallback>'
- local uriSubscribed = self.subscribed[uri]
- if not uriSubscribed then
- return
- end
- self.subscribed[uri] = nil
- for name in pairs(uriSubscribed) do
- self.collect[name][uri] = nil
- if not next(self.collect[name]) then
- self.collect[name] = nil
- end
- end
-end
-
-function mt:dropAll()
- self.subscribed = {}
- self.collect = {}
-end
-
---- 是否包含某个名字的订阅
----@param uri uri
----@param name string
----@return boolean
-function mt:has(uri, name)
- if self:each(uri, name)() then
- return true
- else
- return false
- end
-end
-
-local DUMMY_FUNCTION = function () end
-
----@param scp scope
-local function eachOfFolder(nameCollect, scp)
- local curi, value
-
- local function getNext()
- curi, value = next(nameCollect, curi)
- if not curi then
- return nil, nil
- end
- if scp:isChildUri(curi)
- or scp:isLinkedUri(curi) then
- return value, curi
- end
- return getNext()
- end
-
- return getNext
-end
-
----@param scp scope
-local function eachOfLinked(nameCollect, scp)
- local curi, value
-
- local function getNext()
- curi, value = next(nameCollect, curi)
- if not curi then
- return nil, nil
- end
- if scp:isChildUri(curi)
- and scp:isLinkedUri(curi) then
- return value, curi
- end
-
- local cscp = scope.getFolder(curi)
- or scope.getLinkedScope(curi)
- or scope.fallback
-
- if cscp == scp
- or cscp:isChildUri(scp.uri)
- or cscp:isLinkedUri(scp.uri) then
- return value, curi
- end
-
- return getNext()
- end
-
- return getNext
-end
-
----@param scp scope
-local function eachOfFallback(nameCollect, scp)
- local curi, value
-
- local function getNext()
- curi, value = next(nameCollect, curi)
- if not curi then
- return nil, nil
- end
- if scp:isLinkedUri(curi) then
- return value, curi
- end
-
- local cscp = scope.getFolder(curi)
- or scope.getLinkedScope(curi)
- or scope.fallback
-
- if cscp == scp then
- return value, curi
- end
-
- return getNext()
- end
-
- return getNext
-end
-
---- 迭代某个名字的订阅
----@param uri uri
----@param name string
-function mt:each(uri, name)
- uri = uri or '<fallback>'
- local nameCollect = self.collect[name]
- if not nameCollect then
- return DUMMY_FUNCTION
- end
-
- local scp = scope.getFolder(uri)
-
- if scp then
- return eachOfFolder(nameCollect, scp)
- end
-
- scp = scope.getLinkedScope(uri)
-
- if scp then
- return eachOfLinked(nameCollect, scp)
- end
-
- return eachOfFallback(nameCollect, scope.fallback)
-end
-
-local collectors = {}
-
-local function new()
- return setmetatable({
- collect = {},
- subscribed = {},
- }, mt)
-end
-
----@return collector
-return function (name)
- if name then
- collectors[name] = collectors[name] or new()
- return collectors[name]
- else
- return new()
- end
-end