-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathObservable.lua
More file actions
41 lines (33 loc) · 869 Bytes
/
Observable.lua
File metadata and controls
41 lines (33 loc) · 869 Bytes
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
local class = require("class")
local table_util = require("table_util")
---@alias util.Observer {receive: fun(self: table, event: table)}
---@class util.Observable
---@operator call: util.Observable
local Observable = class()
---@param observer util.Observer
function Observable:add(observer)
if not table_util.indexof(self, observer) then
table.insert(self, observer)
end
end
---@generic T: util.Observer
---@param observer T
---@return T?
function Observable:remove(observer)
local index = table_util.indexof(self, observer)
if index then
return table.remove(self, index)
end
end
---@param event table
function Observable:send(event)
if #self == 1 then
self[1]:receive(event)
return
end
for _, o in ipairs(table_util.copy(self) --[=[@as util.Observer[]]=]) do
o:receive(event)
end
end
Observable.receive = Observable.send
return Observable