public static IAsyncObservable <TSource> Catch <TSource>(this IEnumerable <IAsyncObservable <TSource> > sources) { if (sources == null) { throw new ArgumentNullException(nameof(sources)); } return(Create <TSource>(async observer => { var enumerator = sources.GetEnumerator(); if (!enumerator.MoveNext()) { return AsyncDisposable.Nop; // REVIEW: Is Never behavior right here? } var source = enumerator.Current; var(sink, inner) = AsyncObserver.Catch(observer, enumerator); var subscription = await source.SubscribeSafeAsync(sink).ConfigureAwait(false); return StableCompositeAsyncDisposable.Create(subscription, inner); })); }
public static IAsyncObservable <TSource> Catch <TSource>(this IAsyncObservable <TSource> first, IAsyncObservable <TSource> second) { if (first == null) { throw new ArgumentNullException(nameof(first)); } if (second == null) { throw new ArgumentNullException(nameof(second)); } return(Create <TSource>(async observer => { var(sink, inner) = AsyncObserver.Catch(observer, second); var subscription = await first.SubscribeSafeAsync(sink).ConfigureAwait(false); return StableCompositeAsyncDisposable.Create(subscription, inner); })); }
public static IAsyncObservable <TSource> Catch <TSource, TException>(this IAsyncObservable <TSource> source, Func <TException, ValueTask <IAsyncObservable <TSource> > > handler) where TException : Exception { if (source == null) { throw new ArgumentNullException(nameof(source)); } if (handler == null) { throw new ArgumentNullException(nameof(handler)); } return(Create <TSource>(async observer => { var(sink, inner) = AsyncObserver.Catch(observer, handler); var subscription = await source.SubscribeSafeAsync(sink).ConfigureAwait(false); return StableCompositeAsyncDisposable.Create(subscription, inner); })); }