public static IAsyncObservable <TSource> Amb <TSource>(params IAsyncObservable <TSource>[] sources) { if (sources == null) { throw new ArgumentNullException(nameof(sources)); } return(Create <TSource>(async observer => { var count = sources.Length; var subscriptions = new SingleAssignmentAsyncDisposable[count]; for (var i = 0; i < count; i++) { subscriptions[i] = new SingleAssignmentAsyncDisposable(); } var observers = AsyncObserver.Amb(observer, subscriptions); var tasks = new Task[count]; for (var i = 0; i < count; i++) { tasks[i] = sources[i].SubscribeSafeAsync(observers[i]).AsTask().ContinueWith(d => subscriptions[i].AssignAsync(d.Result).AsTask()).Unwrap(); } await Task.WhenAll(tasks).ConfigureAwait(false); return StableCompositeAsyncDisposable.Create(subscriptions); })); }
public static IAsyncObservable <TSource> Amb <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 firstSubscription = new SingleAssignmentAsyncDisposable(); var secondSubscription = new SingleAssignmentAsyncDisposable(); var(firstObserver, secondObserver) = AsyncObserver.Amb(observer, firstSubscription, secondSubscription); var firstTask = first.SubscribeSafeAsync(firstObserver).AsTask().ContinueWith(d => firstSubscription.AssignAsync(d.Result).AsTask()).Unwrap(); var secondTask = second.SubscribeSafeAsync(secondObserver).AsTask().ContinueWith(d => secondSubscription.AssignAsync(d.Result).AsTask()).Unwrap(); await Task.WhenAll(firstTask, secondTask).ConfigureAwait(false); return StableCompositeAsyncDisposable.Create(firstSubscription, secondSubscription); })); }