switchMap<S> method

Stream<S> switchMap<S>(
  1. Stream<S> mapper(
    1. T value
    )
)

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;
}