Skip to content

Instantly share code, notes, and snippets.

@technorav3nn
Created February 7, 2022 16:23
Show Gist options
  • Select an option

  • Save technorav3nn/3fa233f49ef7e0be87bc8e03cbd41004 to your computer and use it in GitHub Desktop.

Select an option

Save technorav3nn/3fa233f49ef7e0be87bc8e03cbd41004 to your computer and use it in GitHub Desktop.
local BaseEvent = {}
BaseEvent.__index = BaseEvent
function BaseEvent.new(emitter, event, callback)
local self = setmetatable({}, BaseEvent)
self.event = event
self.callback = callback
self.emitter = emitter
return self
end
function BaseEvent:remove()
if self.emitter[self.event] then
self.emitter[self.event] = {}
end
end
function BaseEvent:removeOne(idx)
if self.emitter[self.event][idx] then
self.emitter[self.event][idx] = nil
end
end
-- ///////////////
local LuaEmitter = {}
LuaEmitter.__index = LuaEmitter
function LuaEmitter.new()
local self = setmetatable({}, LuaEmitter)
self._events = {}
return self
end
function LuaEmitter:_removeListener(event, index)
local ev = self._events[event][index]
if not ev then
return
end
self._events[event][index] = nil
end
function LuaEmitter:on(event, callback)
if not self._events[event] then
self._events[event] = {}
end
table.insert(self._events[event], callback)
return BaseEvent.new(self._events, event, callback)
end
function LuaEmitter:emit(event, ...)
local ev = self._events[event]
if not ev or #ev == 0 then
return
end
for _, func in ipairs(ev) do
func(...)
end
end
function LuaEmitter:off(event, callback)
local ev = self._events[event]
if not ev or #ev == 0 then
return
end
for idx, func in ipairs(ev) do
if func == callback then
self:_removeListener(event, idx)
end
end
end
function LuaEmitter:removeListener(event, callback)
return self:off(event, callback)
end
return LuaEmitter
--[[
** Basic Usage **
local emitter = LuaEmitter.new()
local cb = function(...) end
local event = emitter:on("test", cb)
emitter:emit("test", 1, 2, 3)
-- event:remove() -- dispose of EVERY listener on "test"
-- event:removeOne(1) -- remove the 1st listener on "test"
-- emitter:off("test", cb) -- remove the listener
--]]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment