4.x: Optimize Concat(IObservable<IObservable<T>>) #491
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.

This PR implements the
Concat(IObservable<IObservable<T>>)directly in an inlined (less allocation and indirection) and lock-free fashion. (The original was delegated toMerge(sources, 1)which I'd assume has more overhead because dealing with an arbitrary max-concurrency requires a lot of work in Rx.NET too.)I didn't add extra unit tests as this code is meant to be a drop-in replacement of the previous delegated version and is supposed to be well tested already on its own, right?
There is one scenario that I'm not sure about: where both the outer and the current inner sources signal an
OnError, it is not expected the outer error to stop the inner sequence immediately, and whoever's error wins, that is signaled on the boundary between two inner sources. Either I happened to implement this replacement correctly, or the behavior is not verified or specified for this operator.