Created Promise

Created a class to handle monitoring of multiple signals.
This commit is contained in:
Mario Steele 2026-02-26 14:36:51 -06:00
parent 015a601be6
commit 78c100ba7c
2 changed files with 54 additions and 0 deletions

53
lib/promise.gd Normal file
View file

@ -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

1
lib/promise.gd.uid Normal file
View file

@ -0,0 +1 @@
uid://c122j2rn51q11