summaryrefslogtreecommitdiff
path: root/mut/neovim/pack/plugins/start/blink.cmp/lua/blink/cmp/lib/event_emitter.lua
blob: d3939cb943d987a37f985a6236d203a016ce37a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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