Application requirements:
Assumptions:
Then this would be fine.
AStream.SelectMany(a =>
BStream.Where(b => b == a)
.Select(b => new MatchMade(a, b))
.Take(1)
.Timeout(matchTimeout)
.Catch(ex=>Observable.Return(new NoMatchMade(a)))
)