Might be useful to combine all three into one method: IO<T>.ContinueWith(IO<T> onDone, IO<T> onError). Frankly, I was surprised by the behavior of Concat(). I expected it subscribe immediately and then serialize the observations.
It might be helpful to come up with a naming scheme where the method name hints at if the supplied observable will be subscribed to immediately (like Zip... or should that be Combine?) and those which subscribe later. For example the suffix "Then" may work:
ConcatThen(), CatchThen(), OnErrorResumeNextThen(), RepeatThen(), etc.
Clearly that was a mistake in the presentation. The only time Zip would never produce a value is if either stream stops producing values and never trigger done or error (it could also be that both enter this state). Furthermore, there is a race condition
between done and error during zipping which makes the outcome unpredictable. It all depends on which event is observed first (done or error).
Please post a follow up video to this to correct this one. Thanks!