---@class cmp.Event ---@field private events table local event = {} ---Create vents event.new = function() local self = setmetatable({}, { __index = event }) self.events = {} return self end ---Add event listener ---@param name string ---@param callback function ---@return function event.on = function(self, name, callback) if not self.events[name] then self.events[name] = {} end table.insert(self.events[name], callback) return function() self:off(name, callback) end end ---Remove event listener ---@param name string ---@param callback function event.off = function(self, name, callback) for i, callback_ in ipairs(self.events[name] or {}) do if callback_ == callback then table.remove(self.events[name], i) break end end end ---Remove all events event.clear = function(self) self.events = {} end ---Emit event ---@param name string event.emit = function(self, name, ...) for _, callback in ipairs(self.events[name] or {}) do callback(...) end end return event