local spawn = require("./spawn") export type FireSignal = (T...) -> () export type SubscribeSignal = (callback: FireSignal) -> () -> () local function signal(): (SubscribeSignal, FireSignal) local listeners: { (...any) -> () } = {} local count = 0 local function subscribe(callback: (T...) -> ()): () -> () table.insert(listeners, callback) count += 1 return function() local index = table.find(listeners, callback) if index then listeners[index] = listeners[count] listeners[count] = nil count -= 1 end end end local function fire(...: T...) for index = count, 1, -1 do spawn(listeners[index], ...) end end return subscribe, fire end return signal