48 lines
1.1 KiB
Lua
48 lines
1.1 KiB
Lua
|
-------------------------------------------
|
||
|
-- @author https://github.com/Kasper24
|
||
|
-- @copyright 2021-2022 Kasper24
|
||
|
-------------------------------------------
|
||
|
|
||
|
local gobject = require("gears.object")
|
||
|
|
||
|
-- Kidna copying awesotre's stores on a surface level for added compatibility
|
||
|
local function subscribable()
|
||
|
local ret = gobject({})
|
||
|
local subscribed = {}
|
||
|
|
||
|
-- Subscrubes a function to the object so that it's called when `fire` is
|
||
|
-- Calls subscribe_callback if it exists as well
|
||
|
function ret:subscribe(func)
|
||
|
local id = tostring(func):gsub("function: ", "")
|
||
|
subscribed[id] = func
|
||
|
|
||
|
if self.subscribe_callback then
|
||
|
self.subscribe_callback(func)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- Unsubscribes a function and calls unsubscribe_callback if it exists
|
||
|
function ret:unsubscribe(func)
|
||
|
if not func then
|
||
|
subscribed = {}
|
||
|
else
|
||
|
local id = tostring(func):gsub("function: ", "")
|
||
|
subscribed[id] = nil
|
||
|
end
|
||
|
|
||
|
if self.unsubscribe_callback then
|
||
|
self.unsubscribe_callback(func)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function ret:fire(...)
|
||
|
for _, func in pairs(subscribed) do
|
||
|
func(...)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return ret
|
||
|
end
|
||
|
|
||
|
return subscribable
|