summaryrefslogtreecommitdiff
path: root/lua/blink/cmp/lib/event_emitter.lua
diff options
context:
space:
mode:
authorMike Vink <mike@pionative.com>2025-01-19 13:52:52 +0100
committerMike Vink <mike@pionative.com>2025-01-19 13:52:52 +0100
commitb77413ff8f59f380612074f0c9bd49093d8db695 (patch)
tree32c39a811ba96ed4ab0a1c81cce9f8d518ed7e31 /lua/blink/cmp/lib/event_emitter.lua
Squashed 'mut/neovim/pack/plugins/start/blink.cmp/' content from commit 1cc3b1a
git-subtree-dir: mut/neovim/pack/plugins/start/blink.cmp git-subtree-split: 1cc3b1a908fbcfd15451c4772759549724f38524
Diffstat (limited to 'lua/blink/cmp/lib/event_emitter.lua')
-rw-r--r--lua/blink/cmp/lib/event_emitter.lua37
1 files changed, 37 insertions, 0 deletions
diff --git a/lua/blink/cmp/lib/event_emitter.lua b/lua/blink/cmp/lib/event_emitter.lua
new file mode 100644
index 0000000..d3939cb
--- /dev/null
+++ b/lua/blink/cmp/lib/event_emitter.lua
@@ -0,0 +1,37 @@
+--- @class blink.cmp.EventEmitter<T> : { event: string, autocmd?: string, listeners: table<fun(data: T)>, new: ( fun(event: string, autocmd: string): blink.cmp.EventEmitter ), on: ( fun(self: blink.cmp.EventEmitter, callback: fun(data: T)) ), off: ( fun(self: blink.cmp.EventEmitter, callback: fun(data: T)) ), emit: ( fun(self: blink.cmp.EventEmitter, data?: table) ) };
+--- TODO: is there a better syntax for this?
+
+local event_emitter = {}
+
+--- @param event string
+--- @param autocmd? string
+function event_emitter.new(event, autocmd)
+ local self = setmetatable({}, { __index = event_emitter })
+ self.event = event
+ self.autocmd = autocmd
+ self.listeners = {}
+ return self
+end
+
+function event_emitter:on(callback) table.insert(self.listeners, callback) end
+
+function event_emitter:off(callback)
+ for idx, cb in ipairs(self.listeners) do
+ if cb == callback then table.remove(self.listeners, idx) end
+ end
+end
+
+function event_emitter:emit(data)
+ data = data or {}
+ data.event = self.event
+ for _, callback in ipairs(self.listeners) do
+ callback(data)
+ end
+ if self.autocmd then
+ require('blink.cmp.lib.utils').schedule_if_needed(
+ function() vim.api.nvim_exec_autocmds('User', { pattern = self.autocmd, modeline = false, data = data }) end
+ )
+ end
+end
+
+return event_emitter