Files
coa-weakauras/WeakAuras/SubscribableObject.lua
2025-04-03 21:03:11 +02:00

87 lines
2.2 KiB
Lua

if not WeakAuras.IsLibsOK() then return end
local AddonName = ...
local Private = select(2, ...)
local WeakAuras = WeakAuras
local L = WeakAuras.L
local SubscribableObject =
{
events = {},
subscribers = {},
callbacks = {},
ClearSubscribers = function(self)
self.events = {}
self.subscribers = {}
end,
ClearCallbacks = function(self)
self.callbacks = {}
end,
AddSubscriber = function(self, event, subscriber, highPriority)
if not subscriber[event] then
print("Can't register for ", event, " ", subscriber, subscriber.type)
return
end
self.events[event] = self.events[event] or {}
self.subscribers[event] = self.subscribers[event] or {}
if self.subscribers[event][subscriber] then
-- Already subscribed, just return
return
end
self.subscribers[event][subscriber] = true
local pos = highPriority and 1 or (#self.events[event] + 1)
if TableHasAnyEntries(self.events[event]) then
tinsert(self.events[event], pos, subscriber)
else
tinsert(self.events[event], pos, subscriber)
if self.callbacks[event] then
self.callbacks[event]()
end
end
end,
RemoveSubscriber = function(self, event, subscriber)
if self.events[event] then
if not self.subscribers[event][subscriber] then
-- Not subscribed
return
end
self.subscribers[event][subscriber] = nil
local index = tIndexOf(self.events[event], subscriber)
if index then
tremove(self.events[event], index)
if not TableHasAnyEntries(self.events[event]) then
if self.callbacks[event] then
self.callbacks[event]()
end
end
end
end
end,
SetOnSubscriptionStatusChanged = function(self, event, cb)
self.callbacks[event] = cb
end,
Notify = function(self, event, ...)
if self.events[event] then
for _, subscriber in ipairs(self.events[event]) do
subscriber[event](subscriber, ...)
end
end
end,
HasSubscribers = function(self, event)
return self.events[event] and TableHasAnyEntries(self.events[event])
end
}
function Private.CreateSubscribableObject()
return CopyTable(SubscribableObject)
end