But what if xs produces faster than ys? Will Zip start caching or will it drop
xs and always match up the last x and the last y?
Zip will start caching. On Thursday we'll explain CombineLatest which is like what you're describing as the second option...
That's good. Observable.Zip should not change behavior from Enumerable.Zip.
Is there also a combinator that will duplicate the latest of either the left or the right stream? Such that the result is as fast as the fastest stream (after the initial value has been yielded).
If it doesn't exist it can probably be implemented using SelectMany and Until.
That's actually what CombineLatest does. We're missing one that will not duplicate but does take the latest unused value (cache of one, with consumption), will talk to Wes and Erik to see if that would be a useful operator...
Shouldn't zip be Join instead? With join, you have other compositions. For every x, join with y's (respecting an optional predicate selecting x's and related y's). It can be relational. Maybe you already have that. I think with base selectors such as
Select, Join and Choice, you can compose most other things.
There is a Join operator that implements the Join-Calculus, we'll do a future video on that operator for sure!