diff options
| author | William Boman <william@redwill.se> | 2022-07-08 18:34:38 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-07-08 18:34:38 +0200 |
| commit | 976aa4fbee8a070f362cab6f6ec84e9251a90cf9 (patch) | |
| tree | 5e8d9c9c59444a25c7801b8f39763c4ba6e1f76d /lua/mason-core/EventEmitter.lua | |
| parent | feat: add gotests, gomodifytags, impl (#28) (diff) | |
| download | mason-976aa4fbee8a070f362cab6f6ec84e9251a90cf9.tar mason-976aa4fbee8a070f362cab6f6ec84e9251a90cf9.tar.gz mason-976aa4fbee8a070f362cab6f6ec84e9251a90cf9.tar.bz2 mason-976aa4fbee8a070f362cab6f6ec84e9251a90cf9.tar.lz mason-976aa4fbee8a070f362cab6f6ec84e9251a90cf9.tar.xz mason-976aa4fbee8a070f362cab6f6ec84e9251a90cf9.tar.zst mason-976aa4fbee8a070f362cab6f6ec84e9251a90cf9.zip | |
refactor: add mason-schemas and mason-core modules (#29)
* refactor: add mason-schemas and move generated filetype map to mason-lspconfig
* refactor: add mason-core module
Diffstat (limited to 'lua/mason-core/EventEmitter.lua')
| -rw-r--r-- | lua/mason-core/EventEmitter.lua | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/lua/mason-core/EventEmitter.lua b/lua/mason-core/EventEmitter.lua new file mode 100644 index 00000000..672c1778 --- /dev/null +++ b/lua/mason-core/EventEmitter.lua @@ -0,0 +1,64 @@ +---@class EventEmitter +---@field private __event_handlers table<any, table<fun(), fun()>> +---@field private __event_handlers_once table<any, table<fun(), fun()>> +local EventEmitter = {} +EventEmitter.__index = EventEmitter + +---@generic T +---@param obj T +---@return T +function EventEmitter.init(obj) + obj.__event_handlers = {} + obj.__event_handlers_once = {} + return obj +end + +---@param event any +function EventEmitter:emit(event, ...) + if self.__event_handlers[event] then + for handler in pairs(self.__event_handlers[event]) do + pcall(handler, ...) + end + end + if self.__event_handlers_once[event] then + for handler in pairs(self.__event_handlers_once[event]) do + pcall(handler, ...) + self.__event_handlers_once[handler] = nil + end + end +end + +---@param event any +---@param handler fun(payload: any) +function EventEmitter:on(event, handler) + if not self.__event_handlers[event] then + self.__event_handlers[event] = {} + end + self.__event_handlers[event][handler] = handler +end + +---@param event any +---@parma handler fun(payload: any) +function EventEmitter:once(event, handler) + if not self.__event_handlers_once[event] then + self.__event_handlers_once[event] = {} + end + self.__event_handlers_once[event][handler] = handler +end + +---@param event any +---@param handler fun(payload: any) +function EventEmitter:off(event, handler) + if vim.tbl_get(self.__event_handlers, { event, handler }) then + self.__event_handlers[event][handler] = nil + return true + end + return false +end + +function EventEmitter:clear_event_handlers() + self.__event_handlers = {} + self.__event_handlers_once = {} +end + +return EventEmitter |
