implement queue to events emitter

This commit is contained in:
Hiroshi Horie
2022-02-14 14:35:20 +07:00
parent bbd3b5e18e
commit a2e8643ebb
+33 -2
View File
@@ -1,4 +1,5 @@
import 'dart:async';
import 'dart:collection';
import 'package:meta/meta.dart';
import 'package:synchronized/synchronized.dart' as sync;
@@ -22,9 +23,13 @@ class EventsEmitter<T> extends EventsListenable<T> {
// suppport for multiple event listeners
final streamCtrl = StreamController<T>.broadcast(sync: false);
bool _queueMode = false;
final _queue = Queue<T>();
EventsEmitter({
bool listenSynchronized = false,
}) : super(synchronized: listenSynchronized) {
// clean up
onDispose(() async => await streamCtrl.close());
}
@@ -33,14 +38,40 @@ class EventsEmitter<T> extends EventsListenable<T> {
@internal
void emit(T event) {
// do nothing if already closed
if (streamCtrl.isClosed) {
// check if already disposed
if (isDisposed) {
logger.warning('failed to emit event ${event} on a disposed emitter');
return;
}
// queue mode
if (_queueMode) {
_queue.add(event);
return;
}
// emit the event
streamCtrl.add(event);
}
@internal
void updateQueueMode(bool newValue, {bool shouldEmitQueued = true}) {
// check if already disposed
if (isDisposed) {
logger.warning('failed to update queueMode on a disposed emitter');
return;
}
if (_queueMode == newValue) return;
_queueMode = newValue;
if (!_queueMode && shouldEmitQueued) emitQueued();
}
@internal
void emitQueued() {
while (_queue.isNotEmpty) {
final event = _queue.removeFirst();
// emit the event
streamCtrl.add(event);
}
}
}
// for listening only