Files
stadtbote-app/lib/tools/message_service.dart
T
2024-06-21 13:34:43 +02:00

72 lines
1.6 KiB
Dart

typedef EventHandler<T> = void Function(T args);
class _MapEntry {
late dynamic owner;
late dynamic handler;
}
class MessageService {
static final MessageService _singleton = MessageService._internal();
final Map<String, Set<_MapEntry>> _callbackMaps = <String, Set<_MapEntry>>{};
factory MessageService() {
return _singleton;
}
MessageService._internal();
subscribe<T>(String topic, dynamic owner, EventHandler<T>? handler) {
var entry = _MapEntry();
entry.owner = owner;
entry.handler = handler;
if (_callbackMaps.containsKey(topic)) {
_callbackMaps[topic]!.remove(entry);
_callbackMaps[topic]!.add(entry);
} else {
_callbackMaps[topic] = <_MapEntry>{};
_callbackMaps[topic]!.add(entry);
}
}
unsubscribe<T>(String topic, dynamic owner) {
if (_callbackMaps.containsKey(topic)) {
for (var entry in _callbackMaps[topic]!) {
if (entry.owner == owner) {
_callbackMaps[topic]!.remove(entry);
unsubscribe(topic, owner);
break;
}
}
}
}
unsubscribeAll<T>(dynamic owner) {
for (var callbackMapsEntry in _callbackMaps.entries) {
for (var entry in callbackMapsEntry.value.toList()) {
if (entry.owner == owner) {
_callbackMaps[callbackMapsEntry.key]!.remove(entry);
unsubscribeAll(owner);
break;
}
}
}
}
publish<T>(String topic, {T? arguments}) {
var entries = _callbackMaps[topic];
if (entries != null) {
for (var entry in entries) {
entry.handler(arguments);
}
}
}
}