starcheese/eventbus/defaulteventbus.gd

44 lines
1.5 KiB
GDScript3
Raw Normal View History

2024-10-03 18:12:33 +01:00
class_name DefaultEventBus
extends EventBus
var subscribers: Dictionary = {}
func _init():
subscribers = {}
func subscribers_of(event_scope: EventScope, event_type: String) -> Array[Subscription]:
var key = [event_scope, event_type]
return subscribers.get(key, [])
func subscribe_to(event_scope: EventScope, event_type: String, fn: Callable) -> Subscription:
var key = [event_scope, event_type]
var subscriber_set: Array[EventBusSubscription] = subscribers.get(key, [] as Array[EventBusSubscription])
var subscription = EventBusSubscription.new(key, fn, self)
subscriber_set.append(subscription)
subscribers[key] = subscriber_set
return subscription
func publish(event_scope: EventScope, event: Event) -> void:
var key = [event_scope, event.get_type()]
var subscriber_set: Array[EventBusSubscription] = subscribers.get(key, [] as Array[EventBusSubscription]).duplicate(true)
for subscriber in subscriber_set:
var result = subscriber.callback.call(event)
if result == EventResult.ResultType.DISPOSE_SUBSCRIPTION:
subscriber.dispose()
func cancel_scope(event_scope: EventScope) -> void:
var keys_to_cancel: Array = []
for key in subscribers.keys():
if key[0] == event_scope:
keys_to_cancel.append(key)
for key in keys_to_cancel:
var subscriber_set: Array[EventBusSubscription] = subscribers[key]
for subscriber in subscriber_set:
subscriber.dispose()
func dispose() -> void:
for subscriber_set in subscribers.values():
for subscriber in subscriber_set:
subscriber.dispose()
subscribers.clear()