aboutsummaryrefslogtreecommitdiffstats
path: root/lua/mason-core/EventEmitter.lua
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2022-07-08 18:34:38 +0200
committerGitHub <noreply@github.com>2022-07-08 18:34:38 +0200
commit976aa4fbee8a070f362cab6f6ec84e9251a90cf9 (patch)
tree5e8d9c9c59444a25c7801b8f39763c4ba6e1f76d /lua/mason-core/EventEmitter.lua
parentfeat: add gotests, gomodifytags, impl (#28) (diff)
downloadmason-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.lua64
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