512mb-bot/libraries/classes/emitter-proxy.lua

96 lines
2.6 KiB
Lua

local class = import("classes.baseclass")
local emitter_proxy = class("EmitterProxy")
function emitter_proxy:__init(emitter)
self.original = emitter
self.callback_pool = {}
end
function emitter_proxy:on(event,callback)
if not self.callback_pool[event] then
self.callback_pool[event] = {}
end
self.callback_pool[event][callback] = callback
self.original:on(event,callback)
return callback
end
function emitter_proxy:once(event,callback)
if not self.callback_pool[event] then
self.callback_pool[event] = {}
end
local wrapper = function(...)
callback(...)
self.callback_pool[event][callback] = nil
end
self.callback_pool[event][callback] = wrapper
self.callback_pool[event][wrapper] = wrapper
self.original:once(event,wrapper)
return callback
end
function emitter_proxy:removeListener(event,callback)
if self.callback_pool[event] and self.callback_pool[event][callback] then
self.callback_pool[event][callback] = nil
self.original:removeListener(event,callback)
end
end
function emitter_proxy:removeAllListeners(event,callback)
if self.callback_pool[event] then
for k,v in pairs(self.callback_pool[event]) do
self.original:removeListener(event,v)
end
self.callback_pool[event] = nil
end
end
function emitter_proxy:listeners(event)
local copy = {}
if self.callback_pool[event] then
for k,v in pairs(self.callback_pool[event]) do
table.insert(copy,v)
end
end
return copy
end
function emitter_proxy:listenerCount(event)
local count = 0
if event then
if self.callback_pool[event] then
for k,v in pairs(self.callback_pool[event]) do
count = count + 1
end
end
else
for k,v in pairs(self.callback_pool) do
for k2,v2 in pairs(v) do
count = count + 1
end
end
end
return count
end
function emitter_proxy:propogate(event,emitter)
if not self.callback_pool[event] then
self.callback_pool[event] = {}
end
local emitter_propogate_handler = function(...)
emitter:emit(event,...)
end
self.callback_pool[event][emitter_propogate_handler] = emitter_propogate_handler
self.original:on(event,emitter_propogate_handler)
return emitter_propogate_handler
end
function emitter_proxy:destroy()
for k,v in pairs(self.callback_pool) do
for k2,v2 in pairs(v) do
self.original:removeListener(k,v2)
end
end
end
return emitter_proxy