54 lines
1.2 KiB
GDScript3
54 lines
1.2 KiB
GDScript3
|
|
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
|