SyntaxGameServer/RCCService2018/content/LuaPackages/OtterImpl/createSignal.lua

61 lines
1.1 KiB
Lua

local function addToMap(map, addKey, addValue)
local new = {}
for key, value in pairs(map) do
new[key] = value
end
new[addKey] = addValue
return new
end
local function removeFromMap(map, removeKey)
local new = {}
for key, value in pairs(map) do
if key ~= removeKey then
new[key] = value
end
end
return new
end
local function createSignal()
local connections = {}
local function subscribe(self, callback)
assert(typeof(callback) == "function", "Can only subscribe to signals with a function.")
local connection = {
callback = callback,
}
connections = addToMap(connections, callback, connection)
local function disconnect()
assert(not connection.disconnected, "Listeners can only be disconnected once.")
connection.disconnected = true
connections = removeFromMap(connections, callback)
end
return disconnect
end
local function fire(self, ...)
for callback, connection in pairs(connections) do
if not connection.disconnected then
callback(...)
end
end
end
return {
subscribe = subscribe,
fire = fire,
}
end
return createSignal