From 78c100ba7c715f69a0ef78985daf18027152fbeb Mon Sep 17 00:00:00 2001 From: Mario Steele Date: Thu, 26 Feb 2026 14:36:51 -0600 Subject: [PATCH] Created Promise Created a class to handle monitoring of multiple signals. --- lib/promise.gd | 53 ++++++++++++++++++++++++++++++++++++++++++++++ lib/promise.gd.uid | 1 + 2 files changed, 54 insertions(+) create mode 100644 lib/promise.gd create mode 100644 lib/promise.gd.uid diff --git a/lib/promise.gd b/lib/promise.gd new file mode 100644 index 00000000..eaf7653d --- /dev/null +++ b/lib/promise.gd @@ -0,0 +1,53 @@ +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 diff --git a/lib/promise.gd.uid b/lib/promise.gd.uid new file mode 100644 index 00000000..e4d2bbbd --- /dev/null +++ b/lib/promise.gd.uid @@ -0,0 +1 @@ +uid://c122j2rn51q11