immersive-home/app/lib/home_apis/hass_ws/callback_map.gd

46 lines
1.0 KiB
GDScript3
Raw Normal View History

extends Node
2024-03-16 19:45:43 +02:00
## A simple class to manage callbacks for different keys
class_name CallbackMap
2024-03-16 19:45:43 +02:00
## Map of callbacks
var callbacks := {}
2024-03-11 19:09:50 +02:00
var single_callbacks: Array = []
func add(key: Variant, callback: Callable) -> void:
_validate_key(key)
if callbacks.has(key):
callbacks[key].append(callback)
else:
callbacks[key] = [callback]
func add_once(key: Variant, callback: Callable) -> void:
_validate_key(key)
2024-03-11 19:09:50 +02:00
single_callbacks.append(callback)
2024-03-11 19:09:50 +02:00
add(key, callback)
func remove(key: Variant, callback: Callable) -> void:
_validate_key(key)
if callbacks.has(key):
callbacks[key].erase(callback)
2024-03-11 19:09:50 +02:00
if single_callbacks.has(callback):
single_callbacks.erase(callback)
func call_key(key: Variant, args: Array) -> void:
_validate_key(key)
if callbacks.has(key):
for callback in callbacks[key]:
callback.callv(args)
2024-03-11 19:09:50 +02:00
if single_callbacks.has(callback):
remove(key, callback)
func _validate_key(key: Variant):
2024-03-11 19:09:50 +02:00
assert(typeof(key) == TYPE_STRING||typeof(key) == TYPE_INT||typeof(key) == TYPE_FLOAT, "key must be a string or number")