in lib/src/concatenate.dart [24:80]
Stream<T> followedBy(Stream<T> next) {
var controller = isBroadcast
? StreamController<T>.broadcast(sync: true)
: StreamController<T>(sync: true);
next = isBroadcast && !next.isBroadcast ? next.asBroadcastStream() : next;
StreamSubscription<T>? subscription;
var currentStream = this;
var thisDone = false;
var secondDone = false;
late void Function() currentDoneHandler;
void listen() {
subscription = currentStream.listen(controller.add,
onError: controller.addError, onDone: () => currentDoneHandler());
}
void onSecondDone() {
secondDone = true;
controller.close();
}
void onThisDone() {
thisDone = true;
currentStream = next;
currentDoneHandler = onSecondDone;
listen();
}
currentDoneHandler = onThisDone;
controller.onListen = () {
assert(subscription == null);
listen();
if (!isBroadcast) {
controller
..onPause = () {
if (!thisDone || !next.isBroadcast) return subscription!.pause();
subscription!.cancel();
subscription = null;
}
..onResume = () {
if (!thisDone || !next.isBroadcast) return subscription!.resume();
listen();
};
}
controller.onCancel = () {
if (secondDone) return null;
var toCancel = subscription!;
subscription = null;
return toCancel.cancel();
};
};
return controller.stream;
}