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()