implement queue to events emitter
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user