Created Promise
Created a class to handle monitoring of multiple signals.
This commit is contained in:
parent
015a601be6
commit
78c100ba7c
2 changed files with 54 additions and 0 deletions
53
lib/promise.gd
Normal file
53
lib/promise.gd
Normal 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
1
lib/promise.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
|||
uid://c122j2rn51q11
|
||||
Loading…
Add table
Add a link
Reference in a new issue