-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsignal.lua
43 lines (36 loc) · 806 Bytes
/
signal.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
local weak = {__mode = 'k'}
local Signal = {}
Signal.__index = Signal
function Signal.isSignal(value)
if rawequal(value, Signal) then return false end
return getmetatable(value) == Signal
end
function Signal.new()
return setmetatable({
funcHooks = {},
objHooks = setmetatable({}, weak),
}, Signal)
end
function Signal:connect(funcOrEvent, obj)
if type(obj) == 'table' then
self.objHooks[obj] = funcOrEvent
else
self.funcHooks[funcOrEvent] = true
end
end
function Signal:disconnect(funcOrObj)
self.funcHooks[funcOrObj] = nil
self.objHooks[funcOrObj] = nil
end
function Signal:emit(...)
for func in pairs(self.funcHooks) do
func(...)
end
for obj, event in pairs(self.objHooks) do
local callback = obj[event]
if callback then
callback(obj, ...)
end
end
end
return Signal