mirror of
https://github.com/unixtensor/Roblox-Elevator-Game.git
synced 2025-12-14 06:41:55 +00:00
garbage collected signals for the doors
This commit is contained in:
77
src/shared/GC_Signal.luau
Normal file
77
src/shared/GC_Signal.luau
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
--!optimize 2
|
||||||
|
--!strict
|
||||||
|
|
||||||
|
--Garbage collected version of BindableEvents specifically for constantly reused functions
|
||||||
|
|
||||||
|
type ClassConstructor = typeof(setmetatable({} :: Constructor_Return_Props, {} :: Impl_Constructor))
|
||||||
|
type Impl_Constructor = {
|
||||||
|
__index: Impl_Constructor,
|
||||||
|
constructor: Constructor_Fun,
|
||||||
|
--Class functions
|
||||||
|
Fire: <T...>(self: ClassConstructor, T...) -> (),
|
||||||
|
Wait: (self: ClassConstructor) -> (),
|
||||||
|
Connect: (self: ClassConstructor, Callback: <T...>(T...) -> ()) -> Methods,
|
||||||
|
Once: (self: ClassConstructor, Callback: <T...>(T...) -> ()) -> (),
|
||||||
|
DisconnectAll: (self: ClassConstructor) -> (),
|
||||||
|
}
|
||||||
|
type Constructor_Fun = () -> ClassConstructor
|
||||||
|
type Constructor_Return_Props = {
|
||||||
|
__callbacks__: {<T...>(T...) -> ()},
|
||||||
|
__fired__: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
export type constructor = ClassConstructor
|
||||||
|
|
||||||
|
local Signal = {} :: Impl_Constructor
|
||||||
|
Signal.__index = Signal
|
||||||
|
|
||||||
|
function Signal.constructor()
|
||||||
|
return setmetatable({
|
||||||
|
__callbacks__ = {},
|
||||||
|
__fired__ = false
|
||||||
|
}, Signal)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Signal:Fire<T...>(...: T...)
|
||||||
|
self.__fired__ = true
|
||||||
|
for n: number = 1, #self.__callbacks__ do
|
||||||
|
self.__callbacks__[n](...)
|
||||||
|
end
|
||||||
|
self.__fired__ = false
|
||||||
|
end
|
||||||
|
|
||||||
|
function Signal:Wait()
|
||||||
|
repeat
|
||||||
|
task.wait()
|
||||||
|
until self.__fired__
|
||||||
|
end
|
||||||
|
|
||||||
|
type Methods = {
|
||||||
|
Disconnect: (self: Methods) -> ()
|
||||||
|
}
|
||||||
|
local function SignalConnectedMethods(super: ClassConstructor, cid: number)
|
||||||
|
local Methods = {} :: Methods
|
||||||
|
function Methods:Disconnect()
|
||||||
|
super.__callbacks__[cid] = nil
|
||||||
|
end
|
||||||
|
return Methods
|
||||||
|
end
|
||||||
|
function Signal:Connect(Callback)
|
||||||
|
local cid = #self.__callbacks__+1
|
||||||
|
table.insert(self.__callbacks__, cid, Callback)
|
||||||
|
|
||||||
|
return SignalConnectedMethods(self, cid)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Signal:Once(Callback)
|
||||||
|
task.spawn(function()
|
||||||
|
self:Wait()
|
||||||
|
Callback()
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Signal:DisconnectAll()
|
||||||
|
table.clear(self.__callbacks__)
|
||||||
|
end
|
||||||
|
|
||||||
|
return Signal
|
||||||
Reference in New Issue
Block a user