extends RefCounted class_name Promise signal resolved signal denied var waited_signals: Array[Signal] = [] var triggered: Dictionary[Signal, bool] = {} var _denied: bool = false static func from_signals(...sigs: Array) -> Promise: var promise := Promise.new() promise.waited_signals.assign(sigs) for sig: Signal in sigs: promise.triggered[sig] = false return promise func _connect_signals() -> void: for sig: Signal in waited_signals: sig.connect(_handle_signal.bind(sig)) func _disconnect_signals() -> void: for sig: Signal in waited_signals: sig.disconnect(_handle_signal) func _handle_signal(sig: Signal, ...args: Array) -> void: assert(triggered.has(sig), "Signal is not promised!") triggered[sig] = true func any() -> void: while await Engine.get_main_loop().process_frame: if _denied: _disconnect_signals() denied.emit() return if triggered.values().any(func(x): return x): _disconnect_signals() resolved.emit() return func all() -> void: while await Engine.get_main_loop().process_frame: if _denied: _disconnect_signals() denied.emit() return if triggered.values().all(func(x): return x): _disconnect_signals() resolved.emit() return func deny() -> void: _denied = true