-
Notifications
You must be signed in to change notification settings - Fork 29
/
pubsub.lua
60 lines (52 loc) · 1.44 KB
/
pubsub.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
--[[
dead-simple publish-subscribe message bus
]]
local path = (...):gsub("pubsub", "")
local class = require(path .. "class")
local pubsub = class({
name = "pubsub",
})
--create a new pubsub bus
function pubsub:new()
self.subscriptions = {}
end
--(internal; notify a callback set of an event)
function pubsub:_notify(callbacks, ...)
if callbacks then
for _, f in callbacks:ipairs() do
f(...)
end
end
end
--publish an event, with optional arguments
--notifies both the direct subscribers, and those subscribed to "everything"
function pubsub:publish(event, ...)
self:_notify(self.subscriptions[event], ...)
self:_notify(self.subscriptions.everything, event, ...)
end
--subscribe to an event
--can be a specifically named event, or "everything" to get notified for any event
--for "everything", the callback will receive the event name as the first argument
function pubsub:subscribe(event, callback)
local callbacks = self.subscriptions[event]
if not callbacks then
callbacks = set()
self.subscriptions[event] = callbacks
end
callbacks:add(callback)
end
--unsubscribe from an event
function pubsub:unsubscribe(event, callback)
local callbacks = self.subscriptions[event]
if callbacks then
callbacks:remove(callback)
if callbacks:size() == 0 then
self.subscriptions[event] = nil
end
end
end
--check if there is a subscriber for a given event
function pubsub:has_subcriber(event)
return self.subscriptions[event] ~= nil
end
return pubsub