Created
February 7, 2022 16:23
-
-
Save technorav3nn/3fa233f49ef7e0be87bc8e03cbd41004 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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