generated from nvim-lua/nvim-lua-plugin-template
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathevent.lua
63 lines (50 loc) · 1.36 KB
/
event.lua
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
local Set = require('react.util.set')
--- @class Event
--- @field private listeners_map table<string, Set>
local M = {}
function M:new()
local o = {
listeners_map = {},
}
setmetatable(o, self)
self.__index = self
return o
end
--- Add a listener function to a given event
--- @param event string event type to listen
--- @param listener function callback function
--- @param opt nil|{once: boolean} additional options
function M:add_listener(event, listener, opt)
if not self.listeners_map[event] then
self.listeners_map[event] = Set:new()
end
if opt and not opt.once then
self.listeners_map[event]:add(listener)
return
end
local this = self
self.listeners_map[event]:add(function(...)
listener(...)
this:remove_listener(event, listener)
end)
end
--- Remove existing listener from the listeners list for given event
--- @param event string name of the event
--- @param listener function callback function to remove
function M:remove_listener(event, listener)
self.listeners_map[event]:remove_by_value(listener)
end
--- Dispatches an event to all the listeners for a given type of event
--- @param event string type of the event to dispatch
function M:dispatch(event, ...)
local info = {
event = event,
}
if not self.listeners_map[event] then
return
end
for _, listener in self.listeners_map[event]:iter() do
listener(info, ...)
end
end
return M