switchMap<S> method
Implementation
Stream<S> switchMap<S>(Stream<S> Function(T value) mapper) {
late StreamController<S> controller;
StreamSubscription<T>? outerSubscription;
StreamSubscription<S>? innerSubscription;
var outerDone = false;
void closeIfDone() {
if (outerDone && innerSubscription == null) controller.close();
}
controller = StreamController<S>(
sync: true,
onListen: () {
outerSubscription = listen(
(value) {
innerSubscription?.cancel();
innerSubscription = mapper(value).listen(
controller.add,
onError: controller.addError,
onDone: () {
innerSubscription = null;
closeIfDone();
},
);
},
onError: controller.addError,
onDone: () {
outerDone = true;
closeIfDone();
},
);
},
onPause: () {
outerSubscription?.pause();
innerSubscription?.pause();
},
onResume: () {
outerSubscription?.resume();
innerSubscription?.resume();
},
onCancel: () async {
await innerSubscription?.cancel();
await outerSubscription?.cancel();
},
);
return controller.stream;
}