--- @class EventBus EventBus = { _handlers = {}, new = function(self, o) o = o or {} setmetatable(o, self) self.__index = self return o end, --- ---@param self EventBus ---@param event any ---@param handler any ---@param index any on = function(self, event, handler, index) if not self._handlers[event] then self._handlers[event] = {} end self:off(event, handler) if not index then table.insert(self._handlers[event], handler) else -- insertIntoTable(this.handlers[event], handler, index) end end, --- ---@param self EventBus ---@param event any ---@param handler any off = function(self, event, handler) if not self._handlers[event] then return end self._handlers[event] = table.filter(self._handlers[event], function(o) return o ~= handler end) end, --- ---@param self EventBus ---@param event any ---@param ... unknown emit = function(self, event, ...) trace("[EventBus] Emitted " .. event) if not self._handlers[event] then return end for k, handler in pairs(self._handlers[event]) do handler(...) end end }