forked from kanium/starcheese
44 lines
1.5 KiB
GDScript3
44 lines
1.5 KiB
GDScript3
|
|
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()
|