diff --git a/Rx.NET/Source/src/System.Reactive/Linq/IQueryLanguage.cs b/Rx.NET/Source/src/System.Reactive/Linq/IQueryLanguage.cs index 1c3f12305..0c02d8a5a 100644 --- a/Rx.NET/Source/src/System.Reactive/Linq/IQueryLanguage.cs +++ b/Rx.NET/Source/src/System.Reactive/Linq/IQueryLanguage.cs @@ -2,6 +2,8 @@ // The .NET Foundation licenses this file to you under the MIT License. // See the LICENSE file in the project root for more information. +namespace System.Reactive.Linq; + using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; @@ -11,750 +13,748 @@ using System.Threading; using System.Threading.Tasks; -namespace System.Reactive.Linq +/// +/// Internal interface describing the LINQ to Events query language. +/// +internal partial interface IQueryLanguage { - /// - /// Internal interface describing the LINQ to Events query language. - /// - internal partial interface IQueryLanguage - { - #region * Aggregates * - - IObservable Aggregate(IObservable source, TAccumulate seed, Func accumulator); - IObservable Aggregate(IObservable source, TAccumulate seed, Func accumulator, Func resultSelector); - IObservable Aggregate(IObservable source, Func accumulator); - IObservable All(IObservable source, Func predicate); - IObservable Any(IObservable source); - IObservable Any(IObservable source, Func predicate); - IObservable Average(IObservable source); - IObservable Average(IObservable source); - IObservable Average(IObservable source); - IObservable Average(IObservable source); - IObservable Average(IObservable source); - IObservable Average(IObservable source); - IObservable Average(IObservable source); - IObservable Average(IObservable source); - IObservable Average(IObservable source); - IObservable Average(IObservable source); - IObservable Average(IObservable source, Func selector); - IObservable Average(IObservable source, Func selector); - IObservable Average(IObservable source, Func selector); - IObservable Average(IObservable source, Func selector); - IObservable Average(IObservable source, Func selector); - IObservable Average(IObservable source, Func selector); - IObservable Average(IObservable source, Func selector); - IObservable Average(IObservable source, Func selector); - IObservable Average(IObservable source, Func selector); - IObservable Average(IObservable source, Func selector); - IObservable Contains(IObservable source, TSource value); - IObservable Contains(IObservable source, TSource value, IEqualityComparer comparer); - IObservable Count(IObservable source); - IObservable Count(IObservable source, Func predicate); - IObservable ElementAt(IObservable source, int index); - IObservable ElementAtOrDefault(IObservable source, int index); - IObservable FirstAsync(IObservable source); - IObservable FirstAsync(IObservable source, Func predicate); - IObservable FirstOrDefaultAsync(IObservable source); - IObservable FirstOrDefaultAsync(IObservable source, Func predicate); - IObservable IsEmpty(IObservable source); - IObservable LastAsync(IObservable source); - IObservable LastAsync(IObservable source, Func predicate); - IObservable LastOrDefaultAsync(IObservable source); - IObservable LastOrDefaultAsync(IObservable source, Func predicate); - IObservable LongCount(IObservable source); - IObservable LongCount(IObservable source, Func predicate); - IObservable Max(IObservable source); - IObservable Max(IObservable source, IComparer comparer); - IObservable Max(IObservable source); - IObservable Max(IObservable source); - IObservable Max(IObservable source); - IObservable Max(IObservable source); - IObservable Max(IObservable source); - IObservable Max(IObservable source); - IObservable Max(IObservable source); - IObservable Max(IObservable source); - IObservable Max(IObservable source); - IObservable Max(IObservable source); - IObservable Max(IObservable source, Func selector); - IObservable Max(IObservable source, Func selector, IComparer comparer); - IObservable Max(IObservable source, Func selector); - IObservable Max(IObservable source, Func selector); - IObservable Max(IObservable source, Func selector); - IObservable Max(IObservable source, Func selector); - IObservable Max(IObservable source, Func selector); - IObservable Max(IObservable source, Func selector); - IObservable Max(IObservable source, Func selector); - IObservable Max(IObservable source, Func selector); - IObservable Max(IObservable source, Func selector); - IObservable Max(IObservable source, Func selector); - IObservable> MaxBy(IObservable source, Func keySelector); - IObservable> MaxBy(IObservable source, Func keySelector, IComparer comparer); - IObservable Min(IObservable source); - IObservable Min(IObservable source, IComparer comparer); - IObservable Min(IObservable source); - IObservable Min(IObservable source); - IObservable Min(IObservable source); - IObservable Min(IObservable source); - IObservable Min(IObservable source); - IObservable Min(IObservable source); - IObservable Min(IObservable source); - IObservable Min(IObservable source); - IObservable Min(IObservable source); - IObservable Min(IObservable source); - IObservable Min(IObservable source, Func selector); - IObservable Min(IObservable source, Func selector, IComparer comparer); - IObservable Min(IObservable source, Func selector); - IObservable Min(IObservable source, Func selector); - IObservable Min(IObservable source, Func selector); - IObservable Min(IObservable source, Func selector); - IObservable Min(IObservable source, Func selector); - IObservable Min(IObservable source, Func selector); - IObservable Min(IObservable source, Func selector); - IObservable Min(IObservable source, Func selector); - IObservable Min(IObservable source, Func selector); - IObservable Min(IObservable source, Func selector); - IObservable> MinBy(IObservable source, Func keySelector); - IObservable> MinBy(IObservable source, Func keySelector, IComparer comparer); - IObservable SequenceEqual(IObservable first, IObservable second); - IObservable SequenceEqual(IObservable first, IObservable second, IEqualityComparer comparer); - IObservable SequenceEqual(IObservable first, IEnumerable second); - IObservable SequenceEqual(IObservable first, IEnumerable second, IEqualityComparer comparer); - IObservable SingleAsync(IObservable source); - IObservable SingleAsync(IObservable source, Func predicate); - IObservable SingleOrDefaultAsync(IObservable source); - IObservable SingleOrDefaultAsync(IObservable source, Func predicate); - IObservable Sum(IObservable source); - IObservable Sum(IObservable source); - IObservable Sum(IObservable source); - IObservable Sum(IObservable source); - IObservable Sum(IObservable source); - IObservable Sum(IObservable source); - IObservable Sum(IObservable source); - IObservable Sum(IObservable source); - IObservable Sum(IObservable source); - IObservable Sum(IObservable source); - IObservable Sum(IObservable source, Func selector); - IObservable Sum(IObservable source, Func selector); - IObservable Sum(IObservable source, Func selector); - IObservable Sum(IObservable source, Func selector); - IObservable Sum(IObservable source, Func selector); - IObservable Sum(IObservable source, Func selector); - IObservable Sum(IObservable source, Func selector); - IObservable Sum(IObservable source, Func selector); - IObservable Sum(IObservable source, Func selector); - IObservable Sum(IObservable source, Func selector); - IObservable ToArray(IObservable source); - IObservable> ToDictionary(IObservable source, Func keySelector, Func elementSelector, IEqualityComparer comparer) where TKey : notnull; - IObservable> ToDictionary(IObservable source, Func keySelector, Func elementSelector) where TKey : notnull; - IObservable> ToDictionary(IObservable source, Func keySelector, IEqualityComparer comparer) where TKey : notnull; - IObservable> ToDictionary(IObservable source, Func keySelector) where TKey : notnull; - IObservable> ToList(IObservable source); - IObservable> ToLookup(IObservable source, Func keySelector, Func elementSelector, IEqualityComparer comparer); - IObservable> ToLookup(IObservable source, Func keySelector, IEqualityComparer comparer); - IObservable> ToLookup(IObservable source, Func keySelector, Func elementSelector); - IObservable> ToLookup(IObservable source, Func keySelector); - - #endregion - - #region * Async * - - Func> FromAsyncPattern(Func begin, Func end); - Func> FromAsyncPattern(Func begin, Func end); - Func> FromAsyncPattern(Func begin, Func end); - Func> FromAsyncPattern(Func begin, Func end); - Func> FromAsyncPattern(Func begin, Func end); - Func> FromAsyncPattern(Func begin, Func end); - Func> FromAsyncPattern(Func begin, Func end); - Func> FromAsyncPattern(Func begin, Func end); - Func> FromAsyncPattern(Func begin, Func end); - Func> FromAsyncPattern(Func begin, Func end); - Func> FromAsyncPattern(Func begin, Func end); - Func> FromAsyncPattern(Func begin, Func end); - Func> FromAsyncPattern(Func begin, Func end); - Func> FromAsyncPattern(Func begin, Func end); - Func> FromAsyncPattern(Func begin, Func end); - - Func> FromAsyncPattern(Func begin, Action end); - Func> FromAsyncPattern(Func begin, Action end); - Func> FromAsyncPattern(Func begin, Action end); - Func> FromAsyncPattern(Func begin, Action end); - Func> FromAsyncPattern(Func begin, Action end); - Func> FromAsyncPattern(Func begin, Action end); - Func> FromAsyncPattern(Func begin, Action end); - Func> FromAsyncPattern(Func begin, Action end); - Func> FromAsyncPattern(Func begin, Action end); - Func> FromAsyncPattern(Func begin, Action end); - Func> FromAsyncPattern(Func begin, Action end); - Func> FromAsyncPattern(Func begin, Action end); - Func> FromAsyncPattern(Func begin, Action end); - Func> FromAsyncPattern(Func begin, Action end); - Func> FromAsyncPattern(Func begin, Action end); - - IObservable Start(Func function); - IObservable Start(Func function, IScheduler scheduler); - - IObservable StartAsync(Func> functionAsync); - IObservable StartAsync(Func> functionAsync); - IObservable StartAsync(Func> functionAsync, in TaskObservationOptions.Value options); - IObservable StartAsync(Func> functionAsync, in TaskObservationOptions.Value options); - - IObservable Start(Action action); - IObservable Start(Action action, IScheduler scheduler); - - IObservable StartAsync(Func actionAsync); - IObservable StartAsync(Func actionAsync); - IObservable StartAsync(Func actionAsync, in TaskObservationOptions.Value options); - IObservable StartAsync(Func actionAsync, in TaskObservationOptions.Value options); - - IObservable FromAsync(Func> functionAsync); - IObservable FromAsync(Func> functionAsync); - IObservable FromAsync(Func actionAsync); - IObservable FromAsync(Func actionAsync); - IObservable FromAsync(Func> functionAsync, TaskObservationOptions.Value options); - IObservable FromAsync(Func> functionAsync, TaskObservationOptions.Value options); - IObservable FromAsync(Func actionAsync, TaskObservationOptions.Value options); - IObservable FromAsync(Func actionAsync, TaskObservationOptions.Value options); - - Func> ToAsync(Func function); - Func> ToAsync(Func function, IScheduler scheduler); - Func> ToAsync(Func function); - Func> ToAsync(Func function, IScheduler scheduler); - Func> ToAsync(Func function); - Func> ToAsync(Func function, IScheduler scheduler); - Func> ToAsync(Func function); - Func> ToAsync(Func function, IScheduler scheduler); - Func> ToAsync(Func function); - Func> ToAsync(Func function, IScheduler scheduler); - Func> ToAsync(Func function); - Func> ToAsync(Func function, IScheduler scheduler); - Func> ToAsync(Func function); - Func> ToAsync(Func function, IScheduler scheduler); - Func> ToAsync(Func function); - Func> ToAsync(Func function, IScheduler scheduler); - Func> ToAsync(Func function); - Func> ToAsync(Func function, IScheduler scheduler); - Func> ToAsync(Func function); - Func> ToAsync(Func function, IScheduler scheduler); - Func> ToAsync(Func function); - Func> ToAsync(Func function, IScheduler scheduler); - Func> ToAsync(Func function); - Func> ToAsync(Func function, IScheduler scheduler); - Func> ToAsync(Func function); - Func> ToAsync(Func function, IScheduler scheduler); - Func> ToAsync(Func function); - Func> ToAsync(Func function, IScheduler scheduler); - Func> ToAsync(Func function); - Func> ToAsync(Func function, IScheduler scheduler); - Func> ToAsync(Func function); - Func> ToAsync(Func function, IScheduler scheduler); - Func> ToAsync(Func function); - Func> ToAsync(Func function, IScheduler scheduler); - - Func> ToAsync(Action action); - Func> ToAsync(Action action, IScheduler scheduler); - Func> ToAsync(Action action); - Func> ToAsync(Action action, IScheduler scheduler); - Func> ToAsync(Action action); - Func> ToAsync(Action action, IScheduler scheduler); - Func> ToAsync(Action action); - Func> ToAsync(Action action, IScheduler scheduler); - Func> ToAsync(Action action); - Func> ToAsync(Action action, IScheduler scheduler); - Func> ToAsync(Action action); - Func> ToAsync(Action action, IScheduler scheduler); - Func> ToAsync(Action action); - Func> ToAsync(Action action, IScheduler scheduler); - Func> ToAsync(Action action); - Func> ToAsync(Action action, IScheduler scheduler); - Func> ToAsync(Action action); - Func> ToAsync(Action action, IScheduler scheduler); - Func> ToAsync(Action action); - Func> ToAsync(Action action, IScheduler scheduler); - Func> ToAsync(Action action); - Func> ToAsync(Action action, IScheduler scheduler); - Func> ToAsync(Action action); - Func> ToAsync(Action action, IScheduler scheduler); - Func> ToAsync(Action action); - Func> ToAsync(Action action, IScheduler scheduler); - Func> ToAsync(Action action); - Func> ToAsync(Action action, IScheduler scheduler); - Func> ToAsync(Action action); - Func> ToAsync(Action action, IScheduler scheduler); - Func> ToAsync(Action action); - Func> ToAsync(Action action, IScheduler scheduler); - Func> ToAsync(Action action); - Func> ToAsync(Action action, IScheduler scheduler); - - #endregion - - #region * Awaiter * - - AsyncSubject GetAwaiter(IObservable source); - AsyncSubject GetAwaiter(IConnectableObservable source); - AsyncSubject RunAsync(IObservable source, CancellationToken cancellationToken); - AsyncSubject RunAsync(IConnectableObservable source, CancellationToken cancellationToken); - - #endregion - - #region * Binding * - - IConnectableObservable Multicast(IObservable source, ISubject subject); - IObservable Multicast(IObservable source, Func> subjectSelector, Func, IObservable> selector); - IConnectableObservable Publish(IObservable source); - IObservable Publish(IObservable source, Func, IObservable> selector); - IConnectableObservable Publish(IObservable source, TSource initialValue); - IObservable Publish(IObservable source, Func, IObservable> selector, TSource initialValue); - IConnectableObservable PublishLast(IObservable source); - IObservable PublishLast(IObservable source, Func, IObservable> selector); - IObservable RefCount(IConnectableObservable source); - IObservable RefCount(IConnectableObservable source, TimeSpan disconnectDelay); - IObservable RefCount(IConnectableObservable source, TimeSpan disconnectDelay, IScheduler schedulder); - IObservable RefCount(IConnectableObservable source, int minObservers); - IObservable RefCount(IConnectableObservable source, int minObservers, TimeSpan disconnectDelay); - IObservable RefCount(IConnectableObservable source, int minObservers, TimeSpan disconnectDelay, IScheduler schedulder); - IConnectableObservable Replay(IObservable source); - IConnectableObservable Replay(IObservable source, IScheduler scheduler); - IObservable Replay(IObservable source, Func, IObservable> selector); - IObservable Replay(IObservable source, Func, IObservable> selector, IScheduler scheduler); - IConnectableObservable Replay(IObservable source, TimeSpan window); - IObservable Replay(IObservable source, Func, IObservable> selector, TimeSpan window); - IConnectableObservable Replay(IObservable source, TimeSpan window, IScheduler scheduler); - IObservable Replay(IObservable source, Func, IObservable> selector, TimeSpan window, IScheduler scheduler); - IConnectableObservable Replay(IObservable source, int bufferSize, IScheduler scheduler); - IObservable Replay(IObservable source, Func, IObservable> selector, int bufferSize, IScheduler scheduler); - IConnectableObservable Replay(IObservable source, int bufferSize); - IObservable Replay(IObservable source, Func, IObservable> selector, int bufferSize); - IConnectableObservable Replay(IObservable source, int bufferSize, TimeSpan window); - IObservable Replay(IObservable source, Func, IObservable> selector, int bufferSize, TimeSpan window); - IConnectableObservable Replay(IObservable source, int bufferSize, TimeSpan window, IScheduler scheduler); - IObservable Replay(IObservable source, Func, IObservable> selector, int bufferSize, TimeSpan window, IScheduler scheduler); - IObservable AutoConnect(IConnectableObservable source, int minObservers, Action? onConnect); - - #endregion - - #region * Blocking * - - IEnumerable> Chunkify(IObservable source); - IEnumerable Collect(IObservable source, Func newCollector, Func merge); - IEnumerable Collect(IObservable source, Func getInitialCollector, Func merge, Func getNewCollector); - TSource First(IObservable source); - TSource First(IObservable source, Func predicate); - [return: MaybeNull] TSource FirstOrDefault(IObservable source); - [return: MaybeNull] TSource FirstOrDefault(IObservable source, Func predicate); - void ForEach(IObservable source, Action onNext); - void ForEach(IObservable source, Action onNext); - IEnumerator GetEnumerator(IObservable source); - TSource Last(IObservable source); - TSource Last(IObservable source, Func predicate); - [return: MaybeNull] TSource LastOrDefault(IObservable source); - [return: MaybeNull] TSource LastOrDefault(IObservable source, Func predicate); - IEnumerable Latest(IObservable source); - IEnumerable MostRecent(IObservable source, TSource initialValue); - IEnumerable Next(IObservable source); - TSource Single(IObservable source); - [return: MaybeNull] TSource SingleOrDefault(IObservable source, Func predicate); - [return: MaybeNull] TSource SingleOrDefault(IObservable source); - TSource Single(IObservable source, Func predicate); - TSource Wait(IObservable source); - - #endregion - - #region * Concurrency * - - IObservable ObserveOn(IObservable source, IScheduler scheduler); - IObservable ObserveOn(IObservable source, SynchronizationContext context); - - IObservable SubscribeOn(IObservable source, IScheduler scheduler); - IObservable SubscribeOn(IObservable source, SynchronizationContext context); - - IObservable Synchronize(IObservable source); - IObservable Synchronize(IObservable source, object gate); - - #endregion - - #region * Conversions * - - IDisposable Subscribe(IEnumerable source, IObserver observer); - IDisposable Subscribe(IEnumerable source, IObserver observer, IScheduler scheduler); - IEnumerable ToEnumerable(IObservable source); - IEventSource ToEvent(IObservable source); - IEventSource ToEvent(IObservable source); - IEventPatternSource ToEventPattern(IObservable> source); - IObservable ToObservable(IEnumerable source); - IObservable ToObservable(IEnumerable source, IScheduler scheduler); - - #endregion - - #region * Creation * - - IObservable Create(Func, IDisposable> subscribe); - IObservable Create(Func, Action> subscribe); - IObservable Create(Func, CancellationToken, Task> subscribeAsync); - IObservable Create(Func, Task> subscribeAsync); - IObservable Create(Func, CancellationToken, Task> subscribeAsync); - IObservable Create(Func, Task> subscribeAsync); - IObservable Create(Func, CancellationToken, Task> subscribeAsync); - IObservable Create(Func, Task> subscribeAsync); - - IObservable Defer(Func> observableFactory); - - IObservable Defer(Func>> observableFactoryAsync, bool ignoreExceptionsAfterUnsubscribe); - IObservable Defer(Func>> observableFactoryAsync, bool ignoreExceptionsAfterUnsubscribe); - - IObservable Empty(); - IObservable Empty(IScheduler scheduler); - IObservable Generate(TState initialState, Func condition, Func iterate, Func resultSelector); - IObservable Generate(TState initialState, Func condition, Func iterate, Func resultSelector, IScheduler scheduler); - IObservable Never(); - IObservable Range(int start, int count); - IObservable Range(int start, int count, IScheduler scheduler); - IObservable Repeat(TResult value); - IObservable Repeat(TResult value, IScheduler scheduler); - IObservable Repeat(TResult value, int repeatCount); - IObservable Repeat(TResult value, int repeatCount, IScheduler scheduler); - IObservable Return(TResult value); - IObservable Return(TResult value, IScheduler scheduler); - IObservable Throw(Exception exception); - IObservable Throw(Exception exception, IScheduler scheduler); - IObservable Using(Func resourceFactory, Func> observableFactory) where TResource : IDisposable; - IObservable Using(Func> resourceFactoryAsync, Func>> observableFactoryAsync) where TResource : IDisposable; - - #endregion - - #region * Events * - - IObservable> FromEventPattern(Action addHandler, Action removeHandler); - IObservable> FromEventPattern(Action addHandler, Action removeHandler, IScheduler scheduler); - IObservable> FromEventPattern(Action addHandler, Action removeHandler); - IObservable> FromEventPattern(Action addHandler, Action removeHandler, IScheduler scheduler); - IObservable> FromEventPattern(Func, TDelegate> conversion, Action addHandler, Action removeHandler); - IObservable> FromEventPattern(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IScheduler scheduler); - IObservable> FromEventPattern(Action> addHandler, Action> removeHandler); - IObservable> FromEventPattern(Action> addHandler, Action> removeHandler, IScheduler scheduler); - IObservable> FromEventPattern(Action addHandler, Action removeHandler); - IObservable> FromEventPattern(Action addHandler, Action removeHandler, IScheduler scheduler); + #region * Aggregates * + + IObservable Aggregate(IObservable source, TAccumulate seed, Func accumulator); + IObservable Aggregate(IObservable source, TAccumulate seed, Func accumulator, Func resultSelector); + IObservable Aggregate(IObservable source, Func accumulator); + IObservable All(IObservable source, Func predicate); + IObservable Any(IObservable source); + IObservable Any(IObservable source, Func predicate); + IObservable Average(IObservable source); + IObservable Average(IObservable source); + IObservable Average(IObservable source); + IObservable Average(IObservable source); + IObservable Average(IObservable source); + IObservable Average(IObservable source); + IObservable Average(IObservable source); + IObservable Average(IObservable source); + IObservable Average(IObservable source); + IObservable Average(IObservable source); + IObservable Average(IObservable source, Func selector); + IObservable Average(IObservable source, Func selector); + IObservable Average(IObservable source, Func selector); + IObservable Average(IObservable source, Func selector); + IObservable Average(IObservable source, Func selector); + IObservable Average(IObservable source, Func selector); + IObservable Average(IObservable source, Func selector); + IObservable Average(IObservable source, Func selector); + IObservable Average(IObservable source, Func selector); + IObservable Average(IObservable source, Func selector); + IObservable Contains(IObservable source, TSource value); + IObservable Contains(IObservable source, TSource value, IEqualityComparer comparer); + IObservable Count(IObservable source); + IObservable Count(IObservable source, Func predicate); + IObservable ElementAt(IObservable source, int index); + IObservable ElementAtOrDefault(IObservable source, int index); + IObservable FirstAsync(IObservable source); + IObservable FirstAsync(IObservable source, Func predicate); + IObservable FirstOrDefaultAsync(IObservable source); + IObservable FirstOrDefaultAsync(IObservable source, Func predicate); + IObservable IsEmpty(IObservable source); + IObservable LastAsync(IObservable source); + IObservable LastAsync(IObservable source, Func predicate); + IObservable LastOrDefaultAsync(IObservable source); + IObservable LastOrDefaultAsync(IObservable source, Func predicate); + IObservable LongCount(IObservable source); + IObservable LongCount(IObservable source, Func predicate); + IObservable Max(IObservable source); + IObservable Max(IObservable source, IComparer comparer); + IObservable Max(IObservable source); + IObservable Max(IObservable source); + IObservable Max(IObservable source); + IObservable Max(IObservable source); + IObservable Max(IObservable source); + IObservable Max(IObservable source); + IObservable Max(IObservable source); + IObservable Max(IObservable source); + IObservable Max(IObservable source); + IObservable Max(IObservable source); + IObservable Max(IObservable source, Func selector); + IObservable Max(IObservable source, Func selector, IComparer comparer); + IObservable Max(IObservable source, Func selector); + IObservable Max(IObservable source, Func selector); + IObservable Max(IObservable source, Func selector); + IObservable Max(IObservable source, Func selector); + IObservable Max(IObservable source, Func selector); + IObservable Max(IObservable source, Func selector); + IObservable Max(IObservable source, Func selector); + IObservable Max(IObservable source, Func selector); + IObservable Max(IObservable source, Func selector); + IObservable Max(IObservable source, Func selector); + IObservable> MaxBy(IObservable source, Func keySelector); + IObservable> MaxBy(IObservable source, Func keySelector, IComparer comparer); + IObservable Min(IObservable source); + IObservable Min(IObservable source, IComparer comparer); + IObservable Min(IObservable source); + IObservable Min(IObservable source); + IObservable Min(IObservable source); + IObservable Min(IObservable source); + IObservable Min(IObservable source); + IObservable Min(IObservable source); + IObservable Min(IObservable source); + IObservable Min(IObservable source); + IObservable Min(IObservable source); + IObservable Min(IObservable source); + IObservable Min(IObservable source, Func selector); + IObservable Min(IObservable source, Func selector, IComparer comparer); + IObservable Min(IObservable source, Func selector); + IObservable Min(IObservable source, Func selector); + IObservable Min(IObservable source, Func selector); + IObservable Min(IObservable source, Func selector); + IObservable Min(IObservable source, Func selector); + IObservable Min(IObservable source, Func selector); + IObservable Min(IObservable source, Func selector); + IObservable Min(IObservable source, Func selector); + IObservable Min(IObservable source, Func selector); + IObservable Min(IObservable source, Func selector); + IObservable> MinBy(IObservable source, Func keySelector); + IObservable> MinBy(IObservable source, Func keySelector, IComparer comparer); + IObservable SequenceEqual(IObservable first, IObservable second); + IObservable SequenceEqual(IObservable first, IObservable second, IEqualityComparer comparer); + IObservable SequenceEqual(IObservable first, IEnumerable second); + IObservable SequenceEqual(IObservable first, IEnumerable second, IEqualityComparer comparer); + IObservable SingleAsync(IObservable source); + IObservable SingleAsync(IObservable source, Func predicate); + IObservable SingleOrDefaultAsync(IObservable source); + IObservable SingleOrDefaultAsync(IObservable source, Func predicate); + IObservable Sum(IObservable source); + IObservable Sum(IObservable source); + IObservable Sum(IObservable source); + IObservable Sum(IObservable source); + IObservable Sum(IObservable source); + IObservable Sum(IObservable source); + IObservable Sum(IObservable source); + IObservable Sum(IObservable source); + IObservable Sum(IObservable source); + IObservable Sum(IObservable source); + IObservable Sum(IObservable source, Func selector); + IObservable Sum(IObservable source, Func selector); + IObservable Sum(IObservable source, Func selector); + IObservable Sum(IObservable source, Func selector); + IObservable Sum(IObservable source, Func selector); + IObservable Sum(IObservable source, Func selector); + IObservable Sum(IObservable source, Func selector); + IObservable Sum(IObservable source, Func selector); + IObservable Sum(IObservable source, Func selector); + IObservable Sum(IObservable source, Func selector); + IObservable ToArray(IObservable source); + IObservable> ToDictionary(IObservable source, Func keySelector, Func elementSelector, IEqualityComparer comparer) where TKey : notnull; + IObservable> ToDictionary(IObservable source, Func keySelector, Func elementSelector) where TKey : notnull; + IObservable> ToDictionary(IObservable source, Func keySelector, IEqualityComparer comparer) where TKey : notnull; + IObservable> ToDictionary(IObservable source, Func keySelector) where TKey : notnull; + IObservable> ToList(IObservable source); + IObservable> ToLookup(IObservable source, Func keySelector, Func elementSelector, IEqualityComparer comparer); + IObservable> ToLookup(IObservable source, Func keySelector, IEqualityComparer comparer); + IObservable> ToLookup(IObservable source, Func keySelector, Func elementSelector); + IObservable> ToLookup(IObservable source, Func keySelector); + + #endregion + + #region * Async * + + Func> FromAsyncPattern(Func begin, Func end); + Func> FromAsyncPattern(Func begin, Func end); + Func> FromAsyncPattern(Func begin, Func end); + Func> FromAsyncPattern(Func begin, Func end); + Func> FromAsyncPattern(Func begin, Func end); + Func> FromAsyncPattern(Func begin, Func end); + Func> FromAsyncPattern(Func begin, Func end); + Func> FromAsyncPattern(Func begin, Func end); + Func> FromAsyncPattern(Func begin, Func end); + Func> FromAsyncPattern(Func begin, Func end); + Func> FromAsyncPattern(Func begin, Func end); + Func> FromAsyncPattern(Func begin, Func end); + Func> FromAsyncPattern(Func begin, Func end); + Func> FromAsyncPattern(Func begin, Func end); + Func> FromAsyncPattern(Func begin, Func end); + + Func> FromAsyncPattern(Func begin, Action end); + Func> FromAsyncPattern(Func begin, Action end); + Func> FromAsyncPattern(Func begin, Action end); + Func> FromAsyncPattern(Func begin, Action end); + Func> FromAsyncPattern(Func begin, Action end); + Func> FromAsyncPattern(Func begin, Action end); + Func> FromAsyncPattern(Func begin, Action end); + Func> FromAsyncPattern(Func begin, Action end); + Func> FromAsyncPattern(Func begin, Action end); + Func> FromAsyncPattern(Func begin, Action end); + Func> FromAsyncPattern(Func begin, Action end); + Func> FromAsyncPattern(Func begin, Action end); + Func> FromAsyncPattern(Func begin, Action end); + Func> FromAsyncPattern(Func begin, Action end); + Func> FromAsyncPattern(Func begin, Action end); + + IObservable Start(Func function); + IObservable Start(Func function, IScheduler scheduler); + + IObservable StartAsync(Func> functionAsync); + IObservable StartAsync(Func> functionAsync); + IObservable StartAsync(Func> functionAsync, in TaskObservationOptions.Value options); + IObservable StartAsync(Func> functionAsync, in TaskObservationOptions.Value options); + + IObservable Start(Action action); + IObservable Start(Action action, IScheduler scheduler); + + IObservable StartAsync(Func actionAsync); + IObservable StartAsync(Func actionAsync); + IObservable StartAsync(Func actionAsync, in TaskObservationOptions.Value options); + IObservable StartAsync(Func actionAsync, in TaskObservationOptions.Value options); + + IObservable FromAsync(Func> functionAsync); + IObservable FromAsync(Func> functionAsync); + IObservable FromAsync(Func actionAsync); + IObservable FromAsync(Func actionAsync); + IObservable FromAsync(Func> functionAsync, TaskObservationOptions.Value options); + IObservable FromAsync(Func> functionAsync, TaskObservationOptions.Value options); + IObservable FromAsync(Func actionAsync, TaskObservationOptions.Value options); + IObservable FromAsync(Func actionAsync, TaskObservationOptions.Value options); + + Func> ToAsync(Func function); + Func> ToAsync(Func function, IScheduler scheduler); + Func> ToAsync(Func function); + Func> ToAsync(Func function, IScheduler scheduler); + Func> ToAsync(Func function); + Func> ToAsync(Func function, IScheduler scheduler); + Func> ToAsync(Func function); + Func> ToAsync(Func function, IScheduler scheduler); + Func> ToAsync(Func function); + Func> ToAsync(Func function, IScheduler scheduler); + Func> ToAsync(Func function); + Func> ToAsync(Func function, IScheduler scheduler); + Func> ToAsync(Func function); + Func> ToAsync(Func function, IScheduler scheduler); + Func> ToAsync(Func function); + Func> ToAsync(Func function, IScheduler scheduler); + Func> ToAsync(Func function); + Func> ToAsync(Func function, IScheduler scheduler); + Func> ToAsync(Func function); + Func> ToAsync(Func function, IScheduler scheduler); + Func> ToAsync(Func function); + Func> ToAsync(Func function, IScheduler scheduler); + Func> ToAsync(Func function); + Func> ToAsync(Func function, IScheduler scheduler); + Func> ToAsync(Func function); + Func> ToAsync(Func function, IScheduler scheduler); + Func> ToAsync(Func function); + Func> ToAsync(Func function, IScheduler scheduler); + Func> ToAsync(Func function); + Func> ToAsync(Func function, IScheduler scheduler); + Func> ToAsync(Func function); + Func> ToAsync(Func function, IScheduler scheduler); + Func> ToAsync(Func function); + Func> ToAsync(Func function, IScheduler scheduler); + + Func> ToAsync(Action action); + Func> ToAsync(Action action, IScheduler scheduler); + Func> ToAsync(Action action); + Func> ToAsync(Action action, IScheduler scheduler); + Func> ToAsync(Action action); + Func> ToAsync(Action action, IScheduler scheduler); + Func> ToAsync(Action action); + Func> ToAsync(Action action, IScheduler scheduler); + Func> ToAsync(Action action); + Func> ToAsync(Action action, IScheduler scheduler); + Func> ToAsync(Action action); + Func> ToAsync(Action action, IScheduler scheduler); + Func> ToAsync(Action action); + Func> ToAsync(Action action, IScheduler scheduler); + Func> ToAsync(Action action); + Func> ToAsync(Action action, IScheduler scheduler); + Func> ToAsync(Action action); + Func> ToAsync(Action action, IScheduler scheduler); + Func> ToAsync(Action action); + Func> ToAsync(Action action, IScheduler scheduler); + Func> ToAsync(Action action); + Func> ToAsync(Action action, IScheduler scheduler); + Func> ToAsync(Action action); + Func> ToAsync(Action action, IScheduler scheduler); + Func> ToAsync(Action action); + Func> ToAsync(Action action, IScheduler scheduler); + Func> ToAsync(Action action); + Func> ToAsync(Action action, IScheduler scheduler); + Func> ToAsync(Action action); + Func> ToAsync(Action action, IScheduler scheduler); + Func> ToAsync(Action action); + Func> ToAsync(Action action, IScheduler scheduler); + Func> ToAsync(Action action); + Func> ToAsync(Action action, IScheduler scheduler); + + #endregion + + #region * Awaiter * + + AsyncSubject GetAwaiter(IObservable source); + AsyncSubject GetAwaiter(IConnectableObservable source); + AsyncSubject RunAsync(IObservable source, CancellationToken cancellationToken); + AsyncSubject RunAsync(IConnectableObservable source, CancellationToken cancellationToken); + + #endregion + + #region * Binding * + + IConnectableObservable Multicast(IObservable source, ISubject subject); + IObservable Multicast(IObservable source, Func> subjectSelector, Func, IObservable> selector); + IConnectableObservable Publish(IObservable source); + IObservable Publish(IObservable source, Func, IObservable> selector); + IConnectableObservable Publish(IObservable source, TSource initialValue); + IObservable Publish(IObservable source, Func, IObservable> selector, TSource initialValue); + IConnectableObservable PublishLast(IObservable source); + IObservable PublishLast(IObservable source, Func, IObservable> selector); + IObservable RefCount(IConnectableObservable source); + IObservable RefCount(IConnectableObservable source, TimeSpan disconnectDelay); + IObservable RefCount(IConnectableObservable source, TimeSpan disconnectDelay, IScheduler schedulder); + IObservable RefCount(IConnectableObservable source, int minObservers); + IObservable RefCount(IConnectableObservable source, int minObservers, TimeSpan disconnectDelay); + IObservable RefCount(IConnectableObservable source, int minObservers, TimeSpan disconnectDelay, IScheduler schedulder); + IConnectableObservable Replay(IObservable source); + IConnectableObservable Replay(IObservable source, IScheduler scheduler); + IObservable Replay(IObservable source, Func, IObservable> selector); + IObservable Replay(IObservable source, Func, IObservable> selector, IScheduler scheduler); + IConnectableObservable Replay(IObservable source, TimeSpan window); + IObservable Replay(IObservable source, Func, IObservable> selector, TimeSpan window); + IConnectableObservable Replay(IObservable source, TimeSpan window, IScheduler scheduler); + IObservable Replay(IObservable source, Func, IObservable> selector, TimeSpan window, IScheduler scheduler); + IConnectableObservable Replay(IObservable source, int bufferSize, IScheduler scheduler); + IObservable Replay(IObservable source, Func, IObservable> selector, int bufferSize, IScheduler scheduler); + IConnectableObservable Replay(IObservable source, int bufferSize); + IObservable Replay(IObservable source, Func, IObservable> selector, int bufferSize); + IConnectableObservable Replay(IObservable source, int bufferSize, TimeSpan window); + IObservable Replay(IObservable source, Func, IObservable> selector, int bufferSize, TimeSpan window); + IConnectableObservable Replay(IObservable source, int bufferSize, TimeSpan window, IScheduler scheduler); + IObservable Replay(IObservable source, Func, IObservable> selector, int bufferSize, TimeSpan window, IScheduler scheduler); + IObservable AutoConnect(IConnectableObservable source, int minObservers, Action? onConnect); + + #endregion + + #region * Blocking * + + IEnumerable> Chunkify(IObservable source); + IEnumerable Collect(IObservable source, Func newCollector, Func merge); + IEnumerable Collect(IObservable source, Func getInitialCollector, Func merge, Func getNewCollector); + TSource First(IObservable source); + TSource First(IObservable source, Func predicate); + [return: MaybeNull] TSource FirstOrDefault(IObservable source); + [return: MaybeNull] TSource FirstOrDefault(IObservable source, Func predicate); + void ForEach(IObservable source, Action onNext); + void ForEach(IObservable source, Action onNext); + IEnumerator GetEnumerator(IObservable source); + TSource Last(IObservable source); + TSource Last(IObservable source, Func predicate); + [return: MaybeNull] TSource LastOrDefault(IObservable source); + [return: MaybeNull] TSource LastOrDefault(IObservable source, Func predicate); + IEnumerable Latest(IObservable source); + IEnumerable MostRecent(IObservable source, TSource initialValue); + IEnumerable Next(IObservable source); + TSource Single(IObservable source); + [return: MaybeNull] TSource SingleOrDefault(IObservable source, Func predicate); + [return: MaybeNull] TSource SingleOrDefault(IObservable source); + TSource Single(IObservable source, Func predicate); + TSource Wait(IObservable source); + + #endregion + + #region * Concurrency * + + IObservable ObserveOn(IObservable source, IScheduler scheduler); + IObservable ObserveOn(IObservable source, SynchronizationContext context); + + IObservable SubscribeOn(IObservable source, IScheduler scheduler); + IObservable SubscribeOn(IObservable source, SynchronizationContext context); + + IObservable Synchronize(IObservable source); + IObservable Synchronize(IObservable source, object gate); + + #endregion + + #region * Conversions * + + IDisposable Subscribe(IEnumerable source, IObserver observer); + IDisposable Subscribe(IEnumerable source, IObserver observer, IScheduler scheduler); + IEnumerable ToEnumerable(IObservable source); + IEventSource ToEvent(IObservable source); + IEventSource ToEvent(IObservable source); + IEventPatternSource ToEventPattern(IObservable> source); + IObservable ToObservable(IEnumerable source); + IObservable ToObservable(IEnumerable source, IScheduler scheduler); + + #endregion + + #region * Creation * + + IObservable Create(Func, IDisposable> subscribe); + IObservable Create(Func, Action> subscribe); + IObservable Create(Func, CancellationToken, Task> subscribeAsync); + IObservable Create(Func, Task> subscribeAsync); + IObservable Create(Func, CancellationToken, Task> subscribeAsync); + IObservable Create(Func, Task> subscribeAsync); + IObservable Create(Func, CancellationToken, Task> subscribeAsync); + IObservable Create(Func, Task> subscribeAsync); + + IObservable Defer(Func> observableFactory); + + IObservable Defer(Func>> observableFactoryAsync, bool ignoreExceptionsAfterUnsubscribe); + IObservable Defer(Func>> observableFactoryAsync, bool ignoreExceptionsAfterUnsubscribe); + + IObservable Empty(); + IObservable Empty(IScheduler scheduler); + IObservable Generate(TState initialState, Func condition, Func iterate, Func resultSelector); + IObservable Generate(TState initialState, Func condition, Func iterate, Func resultSelector, IScheduler scheduler); + IObservable Never(); + IObservable Range(int start, int count); + IObservable Range(int start, int count, IScheduler scheduler); + IObservable Repeat(TResult value); + IObservable Repeat(TResult value, IScheduler scheduler); + IObservable Repeat(TResult value, int repeatCount); + IObservable Repeat(TResult value, int repeatCount, IScheduler scheduler); + IObservable Return(TResult value); + IObservable Return(TResult value, IScheduler scheduler); + IObservable Throw(Exception exception); + IObservable Throw(Exception exception, IScheduler scheduler); + IObservable Using(Func resourceFactory, Func> observableFactory) where TResource : IDisposable; + IObservable Using(Func> resourceFactoryAsync, Func>> observableFactoryAsync) where TResource : IDisposable; + + #endregion + + #region * Events * + + IObservable> FromEventPattern(Action addHandler, Action removeHandler); + IObservable> FromEventPattern(Action addHandler, Action removeHandler, IScheduler scheduler); + IObservable> FromEventPattern(Action addHandler, Action removeHandler); + IObservable> FromEventPattern(Action addHandler, Action removeHandler, IScheduler scheduler); + IObservable> FromEventPattern(Func, TDelegate> conversion, Action addHandler, Action removeHandler); + IObservable> FromEventPattern(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IScheduler scheduler); + IObservable> FromEventPattern(Action> addHandler, Action> removeHandler); + IObservable> FromEventPattern(Action> addHandler, Action> removeHandler, IScheduler scheduler); + IObservable> FromEventPattern(Action addHandler, Action removeHandler); + IObservable> FromEventPattern(Action addHandler, Action removeHandler, IScheduler scheduler); #if HAS_TRIMMABILITY_ATTRIBUTES - [RequiresUnreferencedCode(Constants_Core.EventReflectionTrimIncompatibilityMessage)] + [RequiresUnreferencedCode(Constants_Core.EventReflectionTrimIncompatibilityMessage)] #endif - IObservable> FromEventPattern(object target, string eventName); + IObservable> FromEventPattern(object target, string eventName); #if HAS_TRIMMABILITY_ATTRIBUTES - [RequiresUnreferencedCode(Constants_Core.EventReflectionTrimIncompatibilityMessage)] + [RequiresUnreferencedCode(Constants_Core.EventReflectionTrimIncompatibilityMessage)] #endif - IObservable> FromEventPattern(object target, string eventName, IScheduler scheduler); + IObservable> FromEventPattern(object target, string eventName, IScheduler scheduler); #if HAS_TRIMMABILITY_ATTRIBUTES - [RequiresUnreferencedCode(Constants_Core.EventReflectionTrimIncompatibilityMessage)] + [RequiresUnreferencedCode(Constants_Core.EventReflectionTrimIncompatibilityMessage)] #endif - IObservable> FromEventPattern(object target, string eventName); + IObservable> FromEventPattern(object target, string eventName); #if HAS_TRIMMABILITY_ATTRIBUTES - [RequiresUnreferencedCode(Constants_Core.EventReflectionTrimIncompatibilityMessage)] + [RequiresUnreferencedCode(Constants_Core.EventReflectionTrimIncompatibilityMessage)] #endif - IObservable> FromEventPattern(object target, string eventName, IScheduler scheduler); + IObservable> FromEventPattern(object target, string eventName, IScheduler scheduler); #if HAS_TRIMMABILITY_ATTRIBUTES - [RequiresUnreferencedCode(Constants_Core.EventReflectionTrimIncompatibilityMessage)] + [RequiresUnreferencedCode(Constants_Core.EventReflectionTrimIncompatibilityMessage)] #endif - IObservable> FromEventPattern(object target, string eventName); + IObservable> FromEventPattern(object target, string eventName); #if HAS_TRIMMABILITY_ATTRIBUTES - [RequiresUnreferencedCode(Constants_Core.EventReflectionTrimIncompatibilityMessage)] + [RequiresUnreferencedCode(Constants_Core.EventReflectionTrimIncompatibilityMessage)] #endif - IObservable> FromEventPattern(object target, string eventName, IScheduler scheduler); + IObservable> FromEventPattern(object target, string eventName, IScheduler scheduler); #if HAS_TRIMMABILITY_ATTRIBUTES - [RequiresUnreferencedCode(Constants_Core.EventReflectionTrimIncompatibilityMessage)] + [RequiresUnreferencedCode(Constants_Core.EventReflectionTrimIncompatibilityMessage)] #endif - IObservable> FromEventPattern(Type type, string eventName); + IObservable> FromEventPattern(Type type, string eventName); #if HAS_TRIMMABILITY_ATTRIBUTES - [RequiresUnreferencedCode(Constants_Core.EventReflectionTrimIncompatibilityMessage)] + [RequiresUnreferencedCode(Constants_Core.EventReflectionTrimIncompatibilityMessage)] #endif - IObservable> FromEventPattern(Type type, string eventName, IScheduler scheduler); + IObservable> FromEventPattern(Type type, string eventName, IScheduler scheduler); #if HAS_TRIMMABILITY_ATTRIBUTES - [RequiresUnreferencedCode(Constants_Core.EventReflectionTrimIncompatibilityMessage)] + [RequiresUnreferencedCode(Constants_Core.EventReflectionTrimIncompatibilityMessage)] #endif - IObservable> FromEventPattern(Type type, string eventName); + IObservable> FromEventPattern(Type type, string eventName); #if HAS_TRIMMABILITY_ATTRIBUTES - [RequiresUnreferencedCode(Constants_Core.EventReflectionTrimIncompatibilityMessage)] + [RequiresUnreferencedCode(Constants_Core.EventReflectionTrimIncompatibilityMessage)] #endif - IObservable> FromEventPattern(Type type, string eventName, IScheduler scheduler); + IObservable> FromEventPattern(Type type, string eventName, IScheduler scheduler); #if HAS_TRIMMABILITY_ATTRIBUTES - [RequiresUnreferencedCode(Constants_Core.EventReflectionTrimIncompatibilityMessage)] + [RequiresUnreferencedCode(Constants_Core.EventReflectionTrimIncompatibilityMessage)] #endif - IObservable> FromEventPattern(Type type, string eventName); + IObservable> FromEventPattern(Type type, string eventName); #if HAS_TRIMMABILITY_ATTRIBUTES - [RequiresUnreferencedCode(Constants_Core.EventReflectionTrimIncompatibilityMessage)] + [RequiresUnreferencedCode(Constants_Core.EventReflectionTrimIncompatibilityMessage)] #endif - IObservable> FromEventPattern(Type type, string eventName, IScheduler scheduler); - - IObservable FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler); - IObservable FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IScheduler scheduler); - IObservable FromEvent(Action addHandler, Action removeHandler); - IObservable FromEvent(Action addHandler, Action removeHandler, IScheduler scheduler); - IObservable FromEvent(Action> addHandler, Action> removeHandler); - IObservable FromEvent(Action> addHandler, Action> removeHandler, IScheduler scheduler); - IObservable FromEvent(Action addHandler, Action removeHandler); - IObservable FromEvent(Action addHandler, Action removeHandler, IScheduler scheduler); - - #endregion - - #region * Imperative * - - Task ForEachAsync(IObservable source, Action onNext); - Task ForEachAsync(IObservable source, Action onNext, CancellationToken cancellationToken); - Task ForEachAsync(IObservable source, Action onNext); - Task ForEachAsync(IObservable source, Action onNext, CancellationToken cancellationToken); - - IObservable Case(Func selector, IDictionary> sources, IObservable defaultSource) where TValue : notnull; - IObservable Case(Func selector, IDictionary> sources, IScheduler scheduler) where TValue : notnull; - IObservable Case(Func selector, IDictionary> sources) where TValue : notnull; - IObservable DoWhile(IObservable source, Func condition); - IObservable For(IEnumerable source, Func> resultSelector); - IObservable If(Func condition, IObservable thenSource, IObservable elseSource); - IObservable If(Func condition, IObservable thenSource); - IObservable If(Func condition, IObservable thenSource, IScheduler scheduler); - IObservable While(Func condition, IObservable source); - - #endregion - - #region * Joins * - - Pattern And(IObservable left, IObservable right); - Plan Then(IObservable source, Func selector); - IObservable When(params Plan[] plans); - IObservable When(IEnumerable> plans); - - #endregion - - #region * Multiple * - - IObservable Amb(IObservable first, IObservable second); - IObservable Amb(params IObservable[] sources); - IObservable Amb(IEnumerable> sources); - IObservable> Buffer(IObservable source, Func> bufferClosingSelector); - IObservable> Buffer(IObservable source, IObservable bufferOpenings, Func> bufferClosingSelector); - IObservable> Buffer(IObservable source, IObservable bufferBoundaries); - IObservable Catch(IObservable source, Func> handler) where TException : Exception; - IObservable Catch(IObservable first, IObservable second); - IObservable Catch(params IObservable[] sources); - IObservable Catch(IEnumerable> sources); - // NB: N-ary overloads of CombineLatest are generated in IQueryLanguage.tt. - IObservable CombineLatest(IEnumerable> sources, Func, TResult> resultSelector); - IObservable> CombineLatest(IEnumerable> sources); - IObservable> CombineLatest(params IObservable[] sources); - IObservable Concat(IObservable first, IObservable second); - IObservable Concat(params IObservable[] sources); - IObservable Concat(IEnumerable> sources); - IObservable Concat(IObservable> sources); - IObservable Merge(IObservable> sources); - IObservable Merge(IObservable> sources, int maxConcurrent); - IObservable Merge(IEnumerable> sources, int maxConcurrent); - IObservable Merge(IEnumerable> sources, int maxConcurrent, IScheduler scheduler); - IObservable Merge(IObservable first, IObservable second); - IObservable Merge(IObservable first, IObservable second, IScheduler scheduler); - IObservable Merge(params IObservable[] sources); - IObservable Merge(IScheduler scheduler, params IObservable[] sources); - IObservable Merge(IEnumerable> sources); - IObservable Merge(IEnumerable> sources, IScheduler scheduler); - IObservable OnErrorResumeNext(IObservable first, IObservable second); - IObservable OnErrorResumeNext(params IObservable[] sources); - IObservable OnErrorResumeNext(IEnumerable> sources); - IObservable SkipUntil(IObservable source, IObservable other); - IObservable Switch(IObservable> sources); - IObservable TakeUntil(IObservable source, IObservable other); - IObservable TakeUntil(IObservable source, Func stopPredicate); - IObservable> Window(IObservable source, Func> windowClosingSelector); - IObservable> Window(IObservable source, IObservable windowOpenings, Func> windowClosingSelector); - IObservable> Window(IObservable source, IObservable windowBoundaries); - IObservable WithLatestFrom(IObservable first, IObservable second, Func resultSelector); - IObservable Zip(IEnumerable> sources, Func, TResult> resultSelector); - IObservable> Zip(IEnumerable> sources); - IObservable> Zip(params IObservable[] sources); - // NB: N-ary overloads of Zip are generated in IQueryLanguage.tt. - IObservable Zip(IObservable first, IEnumerable second, Func resultSelector); - - IObservable Concat(IObservable> sources); - IObservable Merge(IObservable> sources); - IObservable Switch(IObservable> sources); - - #endregion - - #region * Single * - - IObservable Append(IObservable source, TSource value); - IObservable Append(IObservable source, TSource value, IScheduler scheduler); - IObservable AsObservable(IObservable source); - IObservable> Buffer(IObservable source, int count); - IObservable> Buffer(IObservable source, int count, int skip); - IObservable Dematerialize(IObservable> source); - IObservable DistinctUntilChanged(IObservable source); - IObservable DistinctUntilChanged(IObservable source, IEqualityComparer comparer); - IObservable DistinctUntilChanged(IObservable source, Func keySelector); - IObservable DistinctUntilChanged(IObservable source, Func keySelector, IEqualityComparer comparer); - IObservable Do(IObservable source, Action onNext); - IObservable Do(IObservable source, Action onNext, Action onCompleted); - IObservable Do(IObservable source, Action onNext, Action onError); - IObservable Do(IObservable source, Action onNext, Action onError, Action onCompleted); - IObservable Do(IObservable source, IObserver observer); - IObservable Finally(IObservable source, Action finallyAction); - IObservable IgnoreElements(IObservable source); - IObservable> Materialize(IObservable source); - IObservable Prepend(IObservable source, TSource value); - IObservable Prepend(IObservable source, TSource value, IScheduler scheduler); - IObservable Repeat(IObservable source); - IObservable Repeat(IObservable source, int repeatCount); - IObservable RepeatWhen(IObservable source, Func, IObservable> handler); - IObservable Retry(IObservable source); - IObservable Retry(IObservable source, int retryCount); - IObservable RetryWhen(IObservable source, Func, IObservable> handler); - IObservable Scan(IObservable source, TAccumulate seed, Func accumulator); - IObservable Scan(IObservable source, Func accumulator); - IObservable SkipLast(IObservable source, int count); - IObservable StartWith(IObservable source, params TSource[] values); - IObservable StartWith(IObservable source, IScheduler scheduler, params TSource[] values); - IObservable StartWith(IObservable source, IEnumerable values); - IObservable StartWith(IObservable source, IScheduler scheduler, IEnumerable values); - IObservable TakeLast(IObservable source, int count); - IObservable TakeLast(IObservable source, int count, IScheduler scheduler); - IObservable> TakeLastBuffer(IObservable source, int count); - IObservable> Window(IObservable source, int count, int skip); - IObservable> Window(IObservable source, int count); - - #endregion - - #region * StandardSequenceOperators * - - IObservable Cast(IObservable source); - IObservable DefaultIfEmpty(IObservable source); - IObservable DefaultIfEmpty(IObservable source, TSource defaultValue); - IObservable Distinct(IObservable source); - IObservable Distinct(IObservable source, IEqualityComparer comparer); - IObservable Distinct(IObservable source, Func keySelector); - IObservable Distinct(IObservable source, Func keySelector, IEqualityComparer comparer); - IObservable> GroupBy(IObservable source, Func keySelector, Func elementSelector); - IObservable> GroupBy(IObservable source, Func keySelector, IEqualityComparer comparer); - IObservable> GroupBy(IObservable source, Func keySelector); - IObservable> GroupBy(IObservable source, Func keySelector, Func elementSelector, IEqualityComparer comparer); - IObservable> GroupBy(IObservable source, Func keySelector, Func elementSelector, int capacity); - IObservable> GroupBy(IObservable source, Func keySelector, int capacity, IEqualityComparer comparer); - IObservable> GroupBy(IObservable source, Func keySelector, int capacity); - IObservable> GroupBy(IObservable source, Func keySelector, Func elementSelector, int capacity, IEqualityComparer comparer); - IObservable> GroupByUntil(IObservable source, Func keySelector, Func elementSelector, Func, IObservable> durationSelector, IEqualityComparer comparer); - IObservable> GroupByUntil(IObservable source, Func keySelector, Func elementSelector, Func, IObservable> durationSelector); - IObservable> GroupByUntil(IObservable source, Func keySelector, Func, IObservable> durationSelector, IEqualityComparer comparer); - IObservable> GroupByUntil(IObservable source, Func keySelector, Func, IObservable> durationSelector); - IObservable> GroupByUntil(IObservable source, Func keySelector, Func elementSelector, Func, IObservable> durationSelector, int capacity, IEqualityComparer comparer); - IObservable> GroupByUntil(IObservable source, Func keySelector, Func elementSelector, Func, IObservable> durationSelector, int capacity); - IObservable> GroupByUntil(IObservable source, Func keySelector, Func, IObservable> durationSelector, int capacity, IEqualityComparer comparer); - IObservable> GroupByUntil(IObservable source, Func keySelector, Func, IObservable> durationSelector, int capacity); - IObservable GroupJoin(IObservable left, IObservable right, Func> leftDurationSelector, Func> rightDurationSelector, Func, TResult> resultSelector); - IObservable Join(IObservable left, IObservable right, Func> leftDurationSelector, Func> rightDurationSelector, Func resultSelector); - IObservable OfType(IObservable source); - IObservable Select(IObservable source, Func selector); - IObservable Select(IObservable source, Func selector); - IObservable SelectMany(IObservable source, IObservable other); - IObservable SelectMany(IObservable source, Func> selector); - IObservable SelectMany(IObservable source, Func> selector); - IObservable SelectMany(IObservable source, Func> collectionSelector, Func resultSelector); - IObservable SelectMany(IObservable source, Func> collectionSelector, Func resultSelector); - IObservable SelectMany(IObservable source, Func> onNext, Func> onError, Func> onCompleted); - IObservable SelectMany(IObservable source, Func> onNext, Func> onError, Func> onCompleted); - IObservable SelectMany(IObservable source, Func> selector); - IObservable SelectMany(IObservable source, Func> selector); - IObservable SelectMany(IObservable source, Func> collectionSelector, Func resultSelector); - IObservable SelectMany(IObservable source, Func> collectionSelector, Func resultSelector); - IObservable Skip(IObservable source, int count); - IObservable SkipWhile(IObservable source, Func predicate); - IObservable SkipWhile(IObservable source, Func predicate); - IObservable Take(IObservable source, int count); - IObservable Take(IObservable source, int count, IScheduler scheduler); - IObservable TakeWhile(IObservable source, Func predicate); - IObservable TakeWhile(IObservable source, Func predicate); - IObservable Where(IObservable source, Func predicate); - IObservable Where(IObservable source, Func predicate); - - IObservable SelectMany(IObservable source, Func> selector); - IObservable SelectMany(IObservable source, Func> selector); - IObservable SelectMany(IObservable source, Func> selector); - IObservable SelectMany(IObservable source, Func> selector); - IObservable SelectMany(IObservable source, Func> taskSelector, Func resultSelector); - IObservable SelectMany(IObservable source, Func> taskSelector, Func resultSelector); - IObservable SelectMany(IObservable source, Func> taskSelector, Func resultSelector); - IObservable SelectMany(IObservable source, Func> taskSelector, Func resultSelector); - - #endregion - - #region * Time * - - IObservable> Buffer(IObservable source, TimeSpan timeSpan); - IObservable> Buffer(IObservable source, TimeSpan timeSpan, IScheduler scheduler); - IObservable> Buffer(IObservable source, TimeSpan timeSpan, TimeSpan timeShift); - IObservable> Buffer(IObservable source, TimeSpan timeSpan, TimeSpan timeShift, IScheduler scheduler); - IObservable> Buffer(IObservable source, TimeSpan timeSpan, int count); - IObservable> Buffer(IObservable source, TimeSpan timeSpan, int count, IScheduler scheduler); - IObservable Delay(IObservable source, TimeSpan dueTime); - IObservable Delay(IObservable source, TimeSpan dueTime, IScheduler scheduler); - IObservable Delay(IObservable source, DateTimeOffset dueTime); - IObservable Delay(IObservable source, DateTimeOffset dueTime, IScheduler scheduler); - IObservable Delay(IObservable source, Func> delayDurationSelector); - IObservable Delay(IObservable source, IObservable subscriptionDelay, Func> delayDurationSelector); - IObservable DelaySubscription(IObservable source, TimeSpan dueTime); - IObservable DelaySubscription(IObservable source, TimeSpan dueTime, IScheduler scheduler); - IObservable DelaySubscription(IObservable source, DateTimeOffset dueTime); - IObservable DelaySubscription(IObservable source, DateTimeOffset dueTime, IScheduler scheduler); - IObservable Generate(TState initialState, Func condition, Func iterate, Func resultSelector, Func timeSelector); - IObservable Generate(TState initialState, Func condition, Func iterate, Func resultSelector, Func timeSelector, IScheduler scheduler); - IObservable Generate(TState initialState, Func condition, Func iterate, Func resultSelector, Func timeSelector); - IObservable Generate(TState initialState, Func condition, Func iterate, Func resultSelector, Func timeSelector, IScheduler scheduler); - IObservable Interval(TimeSpan period); - IObservable Interval(TimeSpan period, IScheduler scheduler); - IObservable Sample(IObservable source, TimeSpan interval); - IObservable Sample(IObservable source, TimeSpan interval, IScheduler scheduler); - IObservable Sample(IObservable source, IObservable sampler); - IObservable Skip(IObservable source, TimeSpan duration); - IObservable Skip(IObservable source, TimeSpan duration, IScheduler scheduler); - IObservable SkipLast(IObservable source, TimeSpan duration); - IObservable SkipLast(IObservable source, TimeSpan duration, IScheduler scheduler); - IObservable SkipUntil(IObservable source, DateTimeOffset startTime); - IObservable SkipUntil(IObservable source, DateTimeOffset startTime, IScheduler scheduler); - IObservable Take(IObservable source, TimeSpan duration); - IObservable Take(IObservable source, TimeSpan duration, IScheduler scheduler); - IObservable TakeLast(IObservable source, TimeSpan duration); - IObservable TakeLast(IObservable source, TimeSpan duration, IScheduler scheduler); - IObservable TakeLast(IObservable source, TimeSpan duration, IScheduler timerScheduler, IScheduler loopScheduler); - IObservable> TakeLastBuffer(IObservable source, TimeSpan duration); - IObservable> TakeLastBuffer(IObservable source, TimeSpan duration, IScheduler scheduler); - IObservable TakeUntil(IObservable source, DateTimeOffset endTime); - IObservable TakeUntil(IObservable source, DateTimeOffset endTime, IScheduler scheduler); - IObservable Throttle(IObservable source, TimeSpan dueTime); - IObservable Throttle(IObservable source, TimeSpan dueTime, IScheduler scheduler); - IObservable Throttle(IObservable source, Func> throttleDurationSelector); - IObservable> TimeInterval(IObservable source); - IObservable> TimeInterval(IObservable source, IScheduler scheduler); - IObservable Timeout(IObservable source, TimeSpan dueTime); - IObservable Timeout(IObservable source, TimeSpan dueTime, IScheduler scheduler); - IObservable Timeout(IObservable source, TimeSpan dueTime, IObservable other); - IObservable Timeout(IObservable source, TimeSpan dueTime, IObservable other, IScheduler scheduler); - IObservable Timeout(IObservable source, DateTimeOffset dueTime); - IObservable Timeout(IObservable source, DateTimeOffset dueTime, IScheduler scheduler); - IObservable Timeout(IObservable source, DateTimeOffset dueTime, IObservable other); - IObservable Timeout(IObservable source, DateTimeOffset dueTime, IObservable other, IScheduler scheduler); - IObservable Timeout(IObservable source, Func> timeoutDurationSelector); - IObservable Timeout(IObservable source, Func> timeoutDurationSelector, IObservable other); - IObservable Timeout(IObservable source, IObservable firstTimeout, Func> timeoutDurationSelector); - IObservable Timeout(IObservable source, IObservable firstTimeout, Func> timeoutDurationSelector, IObservable other); - IObservable Timer(TimeSpan dueTime); - IObservable Timer(DateTimeOffset dueTime); - IObservable Timer(TimeSpan dueTime, TimeSpan period); - IObservable Timer(DateTimeOffset dueTime, TimeSpan period); - IObservable Timer(TimeSpan dueTime, IScheduler scheduler); - IObservable Timer(DateTimeOffset dueTime, IScheduler scheduler); - IObservable Timer(TimeSpan dueTime, TimeSpan period, IScheduler scheduler); - IObservable Timer(DateTimeOffset dueTime, TimeSpan period, IScheduler scheduler); - IObservable> Timestamp(IObservable source); - IObservable> Timestamp(IObservable source, IScheduler scheduler); - IObservable> Window(IObservable source, TimeSpan timeSpan); - IObservable> Window(IObservable source, TimeSpan timeSpan, IScheduler scheduler); - IObservable> Window(IObservable source, TimeSpan timeSpan, TimeSpan timeShift); - IObservable> Window(IObservable source, TimeSpan timeSpan, TimeSpan timeShift, IScheduler scheduler); - IObservable> Window(IObservable source, TimeSpan timeSpan, int count); - IObservable> Window(IObservable source, TimeSpan timeSpan, int count, IScheduler scheduler); - - #endregion - } + IObservable> FromEventPattern(Type type, string eventName, IScheduler scheduler); + + IObservable FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler); + IObservable FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IScheduler scheduler); + IObservable FromEvent(Action addHandler, Action removeHandler); + IObservable FromEvent(Action addHandler, Action removeHandler, IScheduler scheduler); + IObservable FromEvent(Action> addHandler, Action> removeHandler); + IObservable FromEvent(Action> addHandler, Action> removeHandler, IScheduler scheduler); + IObservable FromEvent(Action addHandler, Action removeHandler); + IObservable FromEvent(Action addHandler, Action removeHandler, IScheduler scheduler); + + #endregion + + #region * Imperative * + + Task ForEachAsync(IObservable source, Action onNext); + Task ForEachAsync(IObservable source, Action onNext, CancellationToken cancellationToken); + Task ForEachAsync(IObservable source, Action onNext); + Task ForEachAsync(IObservable source, Action onNext, CancellationToken cancellationToken); + + IObservable Case(Func selector, IDictionary> sources, IObservable defaultSource) where TValue : notnull; + IObservable Case(Func selector, IDictionary> sources, IScheduler scheduler) where TValue : notnull; + IObservable Case(Func selector, IDictionary> sources) where TValue : notnull; + IObservable DoWhile(IObservable source, Func condition); + IObservable For(IEnumerable source, Func> resultSelector); + IObservable If(Func condition, IObservable thenSource, IObservable elseSource); + IObservable If(Func condition, IObservable thenSource); + IObservable If(Func condition, IObservable thenSource, IScheduler scheduler); + IObservable While(Func condition, IObservable source); + + #endregion + + #region * Joins * + + Pattern And(IObservable left, IObservable right); + Plan Then(IObservable source, Func selector); + IObservable When(params Plan[] plans); + IObservable When(IEnumerable> plans); + + #endregion + + #region * Multiple * + + IObservable Amb(IObservable first, IObservable second); + IObservable Amb(params IObservable[] sources); + IObservable Amb(IEnumerable> sources); + IObservable> Buffer(IObservable source, Func> bufferClosingSelector); + IObservable> Buffer(IObservable source, IObservable bufferOpenings, Func> bufferClosingSelector); + IObservable> Buffer(IObservable source, IObservable bufferBoundaries); + IObservable Catch(IObservable source, Func> handler) where TException : Exception; + IObservable Catch(IObservable first, IObservable second); + IObservable Catch(params IObservable[] sources); + IObservable Catch(IEnumerable> sources); + // NB: N-ary overloads of CombineLatest are generated in IQueryLanguage.tt. + IObservable CombineLatest(IEnumerable> sources, Func, TResult> resultSelector); + IObservable> CombineLatest(IEnumerable> sources); + IObservable> CombineLatest(params IObservable[] sources); + IObservable Concat(IObservable first, IObservable second); + IObservable Concat(params IObservable[] sources); + IObservable Concat(IEnumerable> sources); + IObservable Concat(IObservable> sources); + IObservable Merge(IObservable> sources); + IObservable Merge(IObservable> sources, int maxConcurrent); + IObservable Merge(IEnumerable> sources, int maxConcurrent); + IObservable Merge(IEnumerable> sources, int maxConcurrent, IScheduler scheduler); + IObservable Merge(IObservable first, IObservable second); + IObservable Merge(IObservable first, IObservable second, IScheduler scheduler); + IObservable Merge(params IObservable[] sources); + IObservable Merge(IScheduler scheduler, params IObservable[] sources); + IObservable Merge(IEnumerable> sources); + IObservable Merge(IEnumerable> sources, IScheduler scheduler); + IObservable OnErrorResumeNext(IObservable first, IObservable second); + IObservable OnErrorResumeNext(params IObservable[] sources); + IObservable OnErrorResumeNext(IEnumerable> sources); + IObservable SkipUntil(IObservable source, IObservable other); + IObservable Switch(IObservable> sources); + IObservable TakeUntil(IObservable source, IObservable other); + IObservable TakeUntil(IObservable source, Func stopPredicate); + IObservable TakeUntil(IObservable source, CancellationToken cancellationToken); + IObservable> Window(IObservable source, Func> windowClosingSelector); + IObservable> Window(IObservable source, IObservable windowOpenings, Func> windowClosingSelector); + IObservable> Window(IObservable source, IObservable windowBoundaries); + IObservable WithLatestFrom(IObservable first, IObservable second, Func resultSelector); + IObservable Zip(IEnumerable> sources, Func, TResult> resultSelector); + IObservable> Zip(IEnumerable> sources); + IObservable> Zip(params IObservable[] sources); + // NB: N-ary overloads of Zip are generated in IQueryLanguage.tt. + IObservable Zip(IObservable first, IEnumerable second, Func resultSelector); + + IObservable Concat(IObservable> sources); + IObservable Merge(IObservable> sources); + IObservable Switch(IObservable> sources); + + #endregion + + #region * Single * + + IObservable Append(IObservable source, TSource value); + IObservable Append(IObservable source, TSource value, IScheduler scheduler); + IObservable AsObservable(IObservable source); + IObservable> Buffer(IObservable source, int count); + IObservable> Buffer(IObservable source, int count, int skip); + IObservable Dematerialize(IObservable> source); + IObservable DistinctUntilChanged(IObservable source); + IObservable DistinctUntilChanged(IObservable source, IEqualityComparer comparer); + IObservable DistinctUntilChanged(IObservable source, Func keySelector); + IObservable DistinctUntilChanged(IObservable source, Func keySelector, IEqualityComparer comparer); + IObservable Do(IObservable source, Action onNext); + IObservable Do(IObservable source, Action onNext, Action onCompleted); + IObservable Do(IObservable source, Action onNext, Action onError); + IObservable Do(IObservable source, Action onNext, Action onError, Action onCompleted); + IObservable Do(IObservable source, IObserver observer); + IObservable Finally(IObservable source, Action finallyAction); + IObservable IgnoreElements(IObservable source); + IObservable> Materialize(IObservable source); + IObservable Prepend(IObservable source, TSource value); + IObservable Prepend(IObservable source, TSource value, IScheduler scheduler); + IObservable Repeat(IObservable source); + IObservable Repeat(IObservable source, int repeatCount); + IObservable RepeatWhen(IObservable source, Func, IObservable> handler); + IObservable Retry(IObservable source); + IObservable Retry(IObservable source, int retryCount); + IObservable RetryWhen(IObservable source, Func, IObservable> handler); + IObservable Scan(IObservable source, TAccumulate seed, Func accumulator); + IObservable Scan(IObservable source, Func accumulator); + IObservable SkipLast(IObservable source, int count); + IObservable StartWith(IObservable source, params TSource[] values); + IObservable StartWith(IObservable source, IScheduler scheduler, params TSource[] values); + IObservable StartWith(IObservable source, IEnumerable values); + IObservable StartWith(IObservable source, IScheduler scheduler, IEnumerable values); + IObservable TakeLast(IObservable source, int count); + IObservable TakeLast(IObservable source, int count, IScheduler scheduler); + IObservable> TakeLastBuffer(IObservable source, int count); + IObservable> Window(IObservable source, int count, int skip); + IObservable> Window(IObservable source, int count); + + #endregion + + #region * StandardSequenceOperators * + + IObservable Cast(IObservable source); + IObservable DefaultIfEmpty(IObservable source); + IObservable DefaultIfEmpty(IObservable source, TSource defaultValue); + IObservable Distinct(IObservable source); + IObservable Distinct(IObservable source, IEqualityComparer comparer); + IObservable Distinct(IObservable source, Func keySelector); + IObservable Distinct(IObservable source, Func keySelector, IEqualityComparer comparer); + IObservable> GroupBy(IObservable source, Func keySelector, Func elementSelector); + IObservable> GroupBy(IObservable source, Func keySelector, IEqualityComparer comparer); + IObservable> GroupBy(IObservable source, Func keySelector); + IObservable> GroupBy(IObservable source, Func keySelector, Func elementSelector, IEqualityComparer comparer); + IObservable> GroupBy(IObservable source, Func keySelector, Func elementSelector, int capacity); + IObservable> GroupBy(IObservable source, Func keySelector, int capacity, IEqualityComparer comparer); + IObservable> GroupBy(IObservable source, Func keySelector, int capacity); + IObservable> GroupBy(IObservable source, Func keySelector, Func elementSelector, int capacity, IEqualityComparer comparer); + IObservable> GroupByUntil(IObservable source, Func keySelector, Func elementSelector, Func, IObservable> durationSelector, IEqualityComparer comparer); + IObservable> GroupByUntil(IObservable source, Func keySelector, Func elementSelector, Func, IObservable> durationSelector); + IObservable> GroupByUntil(IObservable source, Func keySelector, Func, IObservable> durationSelector, IEqualityComparer comparer); + IObservable> GroupByUntil(IObservable source, Func keySelector, Func, IObservable> durationSelector); + IObservable> GroupByUntil(IObservable source, Func keySelector, Func elementSelector, Func, IObservable> durationSelector, int capacity, IEqualityComparer comparer); + IObservable> GroupByUntil(IObservable source, Func keySelector, Func elementSelector, Func, IObservable> durationSelector, int capacity); + IObservable> GroupByUntil(IObservable source, Func keySelector, Func, IObservable> durationSelector, int capacity, IEqualityComparer comparer); + IObservable> GroupByUntil(IObservable source, Func keySelector, Func, IObservable> durationSelector, int capacity); + IObservable GroupJoin(IObservable left, IObservable right, Func> leftDurationSelector, Func> rightDurationSelector, Func, TResult> resultSelector); + IObservable Join(IObservable left, IObservable right, Func> leftDurationSelector, Func> rightDurationSelector, Func resultSelector); + IObservable OfType(IObservable source); + IObservable Select(IObservable source, Func selector); + IObservable Select(IObservable source, Func selector); + IObservable SelectMany(IObservable source, IObservable other); + IObservable SelectMany(IObservable source, Func> selector); + IObservable SelectMany(IObservable source, Func> selector); + IObservable SelectMany(IObservable source, Func> collectionSelector, Func resultSelector); + IObservable SelectMany(IObservable source, Func> collectionSelector, Func resultSelector); + IObservable SelectMany(IObservable source, Func> onNext, Func> onError, Func> onCompleted); + IObservable SelectMany(IObservable source, Func> onNext, Func> onError, Func> onCompleted); + IObservable SelectMany(IObservable source, Func> selector); + IObservable SelectMany(IObservable source, Func> selector); + IObservable SelectMany(IObservable source, Func> collectionSelector, Func resultSelector); + IObservable SelectMany(IObservable source, Func> collectionSelector, Func resultSelector); + IObservable Skip(IObservable source, int count); + IObservable SkipWhile(IObservable source, Func predicate); + IObservable SkipWhile(IObservable source, Func predicate); + IObservable Take(IObservable source, int count); + IObservable Take(IObservable source, int count, IScheduler scheduler); + IObservable TakeWhile(IObservable source, Func predicate); + IObservable TakeWhile(IObservable source, Func predicate); + IObservable Where(IObservable source, Func predicate); + IObservable Where(IObservable source, Func predicate); + + IObservable SelectMany(IObservable source, Func> selector); + IObservable SelectMany(IObservable source, Func> selector); + IObservable SelectMany(IObservable source, Func> selector); + IObservable SelectMany(IObservable source, Func> selector); + IObservable SelectMany(IObservable source, Func> taskSelector, Func resultSelector); + IObservable SelectMany(IObservable source, Func> taskSelector, Func resultSelector); + IObservable SelectMany(IObservable source, Func> taskSelector, Func resultSelector); + IObservable SelectMany(IObservable source, Func> taskSelector, Func resultSelector); + + #endregion + + #region * Time * + + IObservable> Buffer(IObservable source, TimeSpan timeSpan); + IObservable> Buffer(IObservable source, TimeSpan timeSpan, IScheduler scheduler); + IObservable> Buffer(IObservable source, TimeSpan timeSpan, TimeSpan timeShift); + IObservable> Buffer(IObservable source, TimeSpan timeSpan, TimeSpan timeShift, IScheduler scheduler); + IObservable> Buffer(IObservable source, TimeSpan timeSpan, int count); + IObservable> Buffer(IObservable source, TimeSpan timeSpan, int count, IScheduler scheduler); + IObservable Delay(IObservable source, TimeSpan dueTime); + IObservable Delay(IObservable source, TimeSpan dueTime, IScheduler scheduler); + IObservable Delay(IObservable source, DateTimeOffset dueTime); + IObservable Delay(IObservable source, DateTimeOffset dueTime, IScheduler scheduler); + IObservable Delay(IObservable source, Func> delayDurationSelector); + IObservable Delay(IObservable source, IObservable subscriptionDelay, Func> delayDurationSelector); + IObservable DelaySubscription(IObservable source, TimeSpan dueTime); + IObservable DelaySubscription(IObservable source, TimeSpan dueTime, IScheduler scheduler); + IObservable DelaySubscription(IObservable source, DateTimeOffset dueTime); + IObservable DelaySubscription(IObservable source, DateTimeOffset dueTime, IScheduler scheduler); + IObservable Generate(TState initialState, Func condition, Func iterate, Func resultSelector, Func timeSelector); + IObservable Generate(TState initialState, Func condition, Func iterate, Func resultSelector, Func timeSelector, IScheduler scheduler); + IObservable Generate(TState initialState, Func condition, Func iterate, Func resultSelector, Func timeSelector); + IObservable Generate(TState initialState, Func condition, Func iterate, Func resultSelector, Func timeSelector, IScheduler scheduler); + IObservable Interval(TimeSpan period); + IObservable Interval(TimeSpan period, IScheduler scheduler); + IObservable Sample(IObservable source, TimeSpan interval); + IObservable Sample(IObservable source, TimeSpan interval, IScheduler scheduler); + IObservable Sample(IObservable source, IObservable sampler); + IObservable Skip(IObservable source, TimeSpan duration); + IObservable Skip(IObservable source, TimeSpan duration, IScheduler scheduler); + IObservable SkipLast(IObservable source, TimeSpan duration); + IObservable SkipLast(IObservable source, TimeSpan duration, IScheduler scheduler); + IObservable SkipUntil(IObservable source, DateTimeOffset startTime); + IObservable SkipUntil(IObservable source, DateTimeOffset startTime, IScheduler scheduler); + IObservable Take(IObservable source, TimeSpan duration); + IObservable Take(IObservable source, TimeSpan duration, IScheduler scheduler); + IObservable TakeLast(IObservable source, TimeSpan duration); + IObservable TakeLast(IObservable source, TimeSpan duration, IScheduler scheduler); + IObservable TakeLast(IObservable source, TimeSpan duration, IScheduler timerScheduler, IScheduler loopScheduler); + IObservable> TakeLastBuffer(IObservable source, TimeSpan duration); + IObservable> TakeLastBuffer(IObservable source, TimeSpan duration, IScheduler scheduler); + IObservable TakeUntil(IObservable source, DateTimeOffset endTime); + IObservable TakeUntil(IObservable source, DateTimeOffset endTime, IScheduler scheduler); + IObservable Throttle(IObservable source, TimeSpan dueTime); + IObservable Throttle(IObservable source, TimeSpan dueTime, IScheduler scheduler); + IObservable Throttle(IObservable source, Func> throttleDurationSelector); + IObservable> TimeInterval(IObservable source); + IObservable> TimeInterval(IObservable source, IScheduler scheduler); + IObservable Timeout(IObservable source, TimeSpan dueTime); + IObservable Timeout(IObservable source, TimeSpan dueTime, IScheduler scheduler); + IObservable Timeout(IObservable source, TimeSpan dueTime, IObservable other); + IObservable Timeout(IObservable source, TimeSpan dueTime, IObservable other, IScheduler scheduler); + IObservable Timeout(IObservable source, DateTimeOffset dueTime); + IObservable Timeout(IObservable source, DateTimeOffset dueTime, IScheduler scheduler); + IObservable Timeout(IObservable source, DateTimeOffset dueTime, IObservable other); + IObservable Timeout(IObservable source, DateTimeOffset dueTime, IObservable other, IScheduler scheduler); + IObservable Timeout(IObservable source, Func> timeoutDurationSelector); + IObservable Timeout(IObservable source, Func> timeoutDurationSelector, IObservable other); + IObservable Timeout(IObservable source, IObservable firstTimeout, Func> timeoutDurationSelector); + IObservable Timeout(IObservable source, IObservable firstTimeout, Func> timeoutDurationSelector, IObservable other); + IObservable Timer(TimeSpan dueTime); + IObservable Timer(DateTimeOffset dueTime); + IObservable Timer(TimeSpan dueTime, TimeSpan period); + IObservable Timer(DateTimeOffset dueTime, TimeSpan period); + IObservable Timer(TimeSpan dueTime, IScheduler scheduler); + IObservable Timer(DateTimeOffset dueTime, IScheduler scheduler); + IObservable Timer(TimeSpan dueTime, TimeSpan period, IScheduler scheduler); + IObservable Timer(DateTimeOffset dueTime, TimeSpan period, IScheduler scheduler); + IObservable> Timestamp(IObservable source); + IObservable> Timestamp(IObservable source, IScheduler scheduler); + IObservable> Window(IObservable source, TimeSpan timeSpan); + IObservable> Window(IObservable source, TimeSpan timeSpan, IScheduler scheduler); + IObservable> Window(IObservable source, TimeSpan timeSpan, TimeSpan timeShift); + IObservable> Window(IObservable source, TimeSpan timeSpan, TimeSpan timeShift, IScheduler scheduler); + IObservable> Window(IObservable source, TimeSpan timeSpan, int count); + IObservable> Window(IObservable source, TimeSpan timeSpan, int count, IScheduler scheduler); + + #endregion } diff --git a/Rx.NET/Source/src/System.Reactive/Linq/Observable.Multiple.cs b/Rx.NET/Source/src/System.Reactive/Linq/Observable.Multiple.cs index 865f791dd..53b6be6c0 100644 --- a/Rx.NET/Source/src/System.Reactive/Linq/Observable.Multiple.cs +++ b/Rx.NET/Source/src/System.Reactive/Linq/Observable.Multiple.cs @@ -2,1182 +2,1199 @@ // The .NET Foundation licenses this file to you under the MIT License. // See the LICENSE file in the project root for more information. +namespace System.Reactive.Linq; + using System.Collections.Generic; -using System.Configuration; using System.Reactive.Concurrency; using System.Threading; using System.Threading.Tasks; -namespace System.Reactive.Linq +public static partial class Observable { - public static partial class Observable + #region + Amb + + + /// + /// Propagates the observable sequence that reacts first. + /// + /// The type of the elements in the source sequences. + /// First observable sequence. + /// Second observable sequence. + /// An observable sequence that surfaces either of the given sequences, whichever reacted first. + /// or is null. + [Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Amb", Justification = "In honor of McCarthy.")] + public static IObservable Amb(this IObservable first, IObservable second) + { + if (first == null) + { + throw new ArgumentNullException(nameof(first)); + } + + if (second == null) + { + throw new ArgumentNullException(nameof(second)); + } + + return s_impl.Amb(first, second); + } + + /// + /// Propagates the observable sequence that reacts first. + /// + /// The type of the elements in the source sequences. + /// Observable sources competing to react first. + /// An observable sequence that surfaces any of the given sequences, whichever reacted first. + /// is null. + [Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Amb", Justification = "In honor of McCarthy.")] + public static IObservable Amb(params IObservable[] sources) + { + if (sources == null) + { + throw new ArgumentNullException(nameof(sources)); + } + + return s_impl.Amb(sources); + } + + /// + /// Propagates the observable sequence that reacts first. + /// + /// The type of the elements in the source sequences. + /// Observable sources competing to react first. + /// An observable sequence that surfaces any of the given sequences, whichever reacted first. + /// is null. + [Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Amb", Justification = "In honor of McCarthy.")] + public static IObservable Amb(this IEnumerable> sources) + { + if (sources == null) + { + throw new ArgumentNullException(nameof(sources)); + } + + return s_impl.Amb(sources); + } + + #endregion + + #region + Buffer + + + /// + /// Projects each element of an observable sequence into consecutive non-overlapping buffers. + /// + /// The type of the elements in the source sequence, and in the lists in the result sequence. + /// The type of the elements in the sequences indicating buffer closing events. + /// Source sequence to produce buffers over. + /// A function invoked to define the boundaries of the produced buffers. A new buffer is started when the previous one is closed. + /// An observable sequence of buffers. + /// or is null. + public static IObservable> Buffer(this IObservable source, Func> bufferClosingSelector) + { + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + if (bufferClosingSelector == null) + { + throw new ArgumentNullException(nameof(bufferClosingSelector)); + } + + return s_impl.Buffer(source, bufferClosingSelector); + } + + /// + /// Projects each element of an observable sequence into zero or more buffers. + /// + /// The type of the elements in the source sequence, and in the lists in the result sequence. + /// The type of the elements in the sequence indicating buffer opening events, also passed to the closing selector to obtain a sequence of buffer closing events. + /// The type of the elements in the sequences indicating buffer closing events. + /// Source sequence to produce buffers over. + /// Observable sequence whose elements denote the creation of new buffers. + /// A function invoked to define the closing of each produced buffer. + /// An observable sequence of buffers. + /// or or is null. + public static IObservable> Buffer(this IObservable source, IObservable bufferOpenings, Func> bufferClosingSelector) + { + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + if (bufferOpenings == null) + { + throw new ArgumentNullException(nameof(bufferOpenings)); + } + + if (bufferClosingSelector == null) + { + throw new ArgumentNullException(nameof(bufferClosingSelector)); + } + + return s_impl.Buffer(source, bufferOpenings, bufferClosingSelector); + } + + /// + /// Projects each element of an observable sequence into consecutive non-overlapping buffers. + /// + /// The type of the elements in the source sequence, and in the lists in the result sequence. + /// The type of the elements in the sequences indicating buffer boundary events. + /// Source sequence to produce buffers over. + /// Sequence of buffer boundary markers. The current buffer is closed and a new buffer is opened upon receiving a boundary marker. + /// An observable sequence of buffers. + /// or is null. + public static IObservable> Buffer(this IObservable source, IObservable bufferBoundaries) + { + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + if (bufferBoundaries == null) + { + throw new ArgumentNullException(nameof(bufferBoundaries)); + } + + return s_impl.Buffer(source, bufferBoundaries); + } + + #endregion + + #region + Catch + + + /// + /// Continues an observable sequence that is terminated by an exception of the specified type with the observable sequence produced by the handler. + /// + /// The type of the elements in the source sequence and sequences returned by the exception handler function. + /// The type of the exception to catch and handle. Needs to derive from . + /// Source sequence. + /// Exception handler function, producing another observable sequence. + /// An observable sequence containing the source sequence's elements, followed by the elements produced by the handler's resulting observable sequence in case an exception occurred. + /// or is null. + public static IObservable Catch(this IObservable source, Func> handler) where TException : Exception + { + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + if (handler == null) + { + throw new ArgumentNullException(nameof(handler)); + } + + return s_impl.Catch(source, handler); + } + + /// + /// Continues an observable sequence that is terminated by an exception with the next observable sequence. + /// + /// The type of the elements in the source sequence and handler sequence. + /// First observable sequence whose exception (if any) is caught. + /// Second observable sequence used to produce results when an error occurred in the first sequence. + /// An observable sequence containing the first sequence's elements, followed by the elements of the second sequence in case an exception occurred. + /// or is null. + public static IObservable Catch(this IObservable first, IObservable second) + { + if (first == null) + { + throw new ArgumentNullException(nameof(first)); + } + + if (second == null) + { + throw new ArgumentNullException(nameof(second)); + } + + return s_impl.Catch(first, second); + } + + /// + /// Continues an observable sequence that is terminated by an exception with the next observable sequence. + /// + /// The type of the elements in the source and handler sequences. + /// Observable sequences to catch exceptions for. + /// An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully. + /// is null. + public static IObservable Catch(params IObservable[] sources) + { + if (sources == null) + { + throw new ArgumentNullException(nameof(sources)); + } + + return s_impl.Catch(sources); + } + + /// + /// Continues an observable sequence that is terminated by an exception with the next observable sequence. + /// + /// The type of the elements in the source and handler sequences. + /// Observable sequences to catch exceptions for. + /// An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully. + /// is null. + public static IObservable Catch(this IEnumerable> sources) + { + if (sources == null) + { + throw new ArgumentNullException(nameof(sources)); + } + + return s_impl.Catch(sources); + } + + #endregion + + #region + CombineLatest + + + /// + /// Merges two observable sequences into one observable sequence by using the selector function whenever one of the observable sequences produces an element. + /// + /// The type of the elements in the first source sequence. + /// The type of the elements in the second source sequence. + /// The type of the elements in the result sequence, returned by the selector function. + /// First observable source. + /// Second observable source. + /// Function to invoke whenever either of the sources produces an element. + /// An observable sequence containing the result of combining elements of both sources using the specified result selector function. + /// or or is null. + /// If a non-empty source completes, its very last value will be used for creating subsequent combinations until all sources terminate. + public static IObservable CombineLatest(this IObservable first, IObservable second, Func resultSelector) + { + if (first == null) + { + throw new ArgumentNullException(nameof(first)); + } + + if (second == null) + { + throw new ArgumentNullException(nameof(second)); + } + + if (resultSelector == null) + { + throw new ArgumentNullException(nameof(resultSelector)); + } + + return s_impl.CombineLatest(first, second, resultSelector); + } + + /// + /// Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. + /// + /// The type of the elements in the source sequences. + /// The type of the elements in the result sequence, returned by the selector function. + /// Observable sources. + /// Function to invoke whenever any of the sources produces an element. For efficiency, the input list is reused after the selector returns. Either aggregate or copy the values during the function call. + /// An observable sequence containing the result of combining elements of the sources using the specified result selector function. + /// or is null. + /// If a non-empty source completes, its very last value will be used for creating subsequent combinations until all sources terminate. + public static IObservable CombineLatest(this IEnumerable> sources, Func, TResult> resultSelector) + { + if (sources == null) + { + throw new ArgumentNullException(nameof(sources)); + } + + if (resultSelector == null) + { + throw new ArgumentNullException(nameof(resultSelector)); + } + + return s_impl.CombineLatest(sources, resultSelector); + } + + /// + /// Merges the specified observable sequences into one observable sequence by emitting a list with the latest source elements whenever any of the observable sequences produces an element. + /// + /// The type of the elements in the source sequences, and in the lists in the result sequence. + /// Observable sources. + /// An observable sequence containing lists of the latest elements of the sources. + /// is null. + /// If a non-empty source completes, its very last value will be used for creating subsequent combinations until all sources terminate. + public static IObservable> CombineLatest(this IEnumerable> sources) + { + if (sources == null) + { + throw new ArgumentNullException(nameof(sources)); + } + + return s_impl.CombineLatest(sources); + } + + /// + /// Merges the specified observable sequences into one observable sequence by emitting a list with the latest source elements whenever any of the observable sequences produces an element. + /// + /// The type of the elements in the source sequences, and in the lists in the result sequence. + /// Observable sources. + /// An observable sequence containing lists of the latest elements of the sources. + /// is null. + /// If a non-empty source completes, its very last value will be used for creating subsequent combinations until all sources terminate. + public static IObservable> CombineLatest(params IObservable[] sources) + { + if (sources == null) + { + throw new ArgumentNullException(nameof(sources)); + } + + return s_impl.CombineLatest(sources); + } + + #endregion + + #region + Concat + + + /// + /// Concatenates the second observable sequence to the first observable sequence upon successful termination of the first. + /// + /// The type of the elements in the source sequences. + /// First observable sequence. + /// Second observable sequence. + /// An observable sequence that contains the elements of the first sequence, followed by those of the second the sequence. + /// or is null. + public static IObservable Concat(this IObservable first, IObservable second) + { + if (first == null) + { + throw new ArgumentNullException(nameof(first)); + } + + if (second == null) + { + throw new ArgumentNullException(nameof(second)); + } + + return s_impl.Concat(first, second); + } + + /// + /// Concatenates all of the specified observable sequences, as long as the previous observable sequence terminated successfully. + /// + /// The type of the elements in the source sequences. + /// Observable sequences to concatenate. + /// An observable sequence that contains the elements of each given sequence, in sequential order. + /// is null. + public static IObservable Concat(params IObservable[] sources) + { + if (sources == null) + { + throw new ArgumentNullException(nameof(sources)); + } + + return s_impl.Concat(sources); + } + + /// + /// Concatenates all observable sequences in the given enumerable sequence, as long as the previous observable sequence terminated successfully. + /// + /// The type of the elements in the source sequences. + /// Observable sequences to concatenate. + /// An observable sequence that contains the elements of each given sequence, in sequential order. + /// is null. + public static IObservable Concat(this IEnumerable> sources) + { + if (sources == null) + { + throw new ArgumentNullException(nameof(sources)); + } + + return s_impl.Concat(sources); + } + + /// + /// Concatenates all inner observable sequences, as long as the previous observable sequence terminated successfully. + /// + /// The type of the elements in the source sequences. + /// Observable sequence of inner observable sequences. + /// An observable sequence that contains the elements of each observed inner sequence, in sequential order. + /// is null. + public static IObservable Concat(this IObservable> sources) + { + if (sources == null) + { + throw new ArgumentNullException(nameof(sources)); + } + + return s_impl.Concat(sources); + } + + /// + /// Concatenates all task results, as long as the previous task terminated successfully. + /// + /// The type of the results produced by the tasks. + /// Observable sequence of tasks. + /// An observable sequence that contains the results of each task, in sequential order. + /// is null. + /// If the tasks support cancellation, consider manual conversion of the tasks using , followed by a concatenation operation using . + public static IObservable Concat(this IObservable> sources) + { + if (sources == null) + { + throw new ArgumentNullException(nameof(sources)); + } + + return s_impl.Concat(sources); + } + + #endregion + + #region + Merge + + + /// + /// Merges elements from all inner observable sequences into a single observable sequence. + /// + /// The type of the elements in the source sequences. + /// Observable sequence of inner observable sequences. + /// The observable sequence that merges the elements of the inner sequences. + /// is null. + public static IObservable Merge(this IObservable> sources) + { + if (sources == null) + { + throw new ArgumentNullException(nameof(sources)); + } + + return s_impl.Merge(sources); + } + + /// + /// Merges results from all source tasks into a single observable sequence. + /// + /// The type of the results produced by the source tasks. + /// Observable sequence of tasks. + /// The observable sequence that merges the results of the source tasks. + /// is null. + /// If the tasks support cancellation, consider manual conversion of the tasks using , followed by a merge operation using . + public static IObservable Merge(this IObservable> sources) + { + if (sources == null) + { + throw new ArgumentNullException(nameof(sources)); + } + + return s_impl.Merge(sources); + } + + /// + /// Merges elements from all inner observable sequences into a single observable sequence, limiting the number of concurrent subscriptions to inner sequences. + /// + /// The type of the elements in the source sequences. + /// Observable sequence of inner observable sequences. + /// Maximum number of inner observable sequences being subscribed to concurrently. + /// The observable sequence that merges the elements of the inner sequences. + /// is null. + /// is less than or equal to zero. + public static IObservable Merge(this IObservable> sources, int maxConcurrent) + { + if (sources == null) + { + throw new ArgumentNullException(nameof(sources)); + } + + if (maxConcurrent <= 0) + { + throw new ArgumentOutOfRangeException(nameof(maxConcurrent)); + } + + return s_impl.Merge(sources, maxConcurrent); + } + + /// + /// Merges elements from all observable sequences in the given enumerable sequence into a single observable sequence, limiting the number of concurrent subscriptions to inner sequences. + /// + /// The type of the elements in the source sequences. + /// Enumerable sequence of observable sequences. + /// Maximum number of observable sequences being subscribed to concurrently. + /// The observable sequence that merges the elements of the observable sequences. + /// is null. + /// is less than or equal to zero. + public static IObservable Merge(this IEnumerable> sources, int maxConcurrent) + { + if (sources == null) + { + throw new ArgumentNullException(nameof(sources)); + } + + if (maxConcurrent <= 0) + { + throw new ArgumentOutOfRangeException(nameof(maxConcurrent)); + } + + return s_impl.Merge(sources, maxConcurrent); + } + + /// + /// Merges elements from all observable sequences in the given enumerable sequence into a single observable sequence, limiting the number of concurrent subscriptions to inner sequences, and using the specified scheduler for enumeration of and subscription to the sources. + /// + /// The type of the elements in the source sequences. + /// Enumerable sequence of observable sequences. + /// Maximum number of observable sequences being subscribed to concurrently. + /// Scheduler to run the enumeration of the sequence of sources on. + /// The observable sequence that merges the elements of the observable sequences. + /// or is null. + /// is less than or equal to zero. + public static IObservable Merge(this IEnumerable> sources, int maxConcurrent, IScheduler scheduler) + { + if (sources == null) + { + throw new ArgumentNullException(nameof(sources)); + } + + if (maxConcurrent <= 0) + { + throw new ArgumentOutOfRangeException(nameof(maxConcurrent)); + } + + if (scheduler == null) + { + throw new ArgumentNullException(nameof(scheduler)); + } + + return s_impl.Merge(sources, maxConcurrent, scheduler); + } + + /// + /// Merges elements from two observable sequences into a single observable sequence. + /// + /// The type of the elements in the source sequences. + /// First observable sequence. + /// Second observable sequence. + /// The observable sequence that merges the elements of the given sequences. + /// or is null. + public static IObservable Merge(this IObservable first, IObservable second) + { + if (first == null) + { + throw new ArgumentNullException(nameof(first)); + } + + if (second == null) + { + throw new ArgumentNullException(nameof(second)); + } + + return s_impl.Merge(first, second); + } + + /// + /// Merges elements from two observable sequences into a single observable sequence, using the specified scheduler for enumeration of and subscription to the sources. + /// + /// The type of the elements in the source sequences. + /// First observable sequence. + /// Second observable sequence. + /// Scheduler used to introduce concurrency for making subscriptions to the given sequences. + /// The observable sequence that merges the elements of the given sequences. + /// or or is null. + public static IObservable Merge(this IObservable first, IObservable second, IScheduler scheduler) + { + if (first == null) + { + throw new ArgumentNullException(nameof(first)); + } + + if (second == null) + { + throw new ArgumentNullException(nameof(second)); + } + + if (scheduler == null) + { + throw new ArgumentNullException(nameof(scheduler)); + } + + return s_impl.Merge(first, second, scheduler); + } + + /// + /// Merges elements from all of the specified observable sequences into a single observable sequence. + /// + /// The type of the elements in the source sequences. + /// Observable sequences. + /// The observable sequence that merges the elements of the observable sequences. + /// is null. + public static IObservable Merge(params IObservable[] sources) + { + if (sources == null) + { + throw new ArgumentNullException(nameof(sources)); + } + + return s_impl.Merge(sources); + } + + /// + /// Merges elements from all of the specified observable sequences into a single observable sequence, using the specified scheduler for enumeration of and subscription to the sources. + /// + /// The type of the elements in the source sequences. + /// Observable sequences. + /// Scheduler to run the enumeration of the sequence of sources on. + /// The observable sequence that merges the elements of the observable sequences. + /// or is null. + public static IObservable Merge(IScheduler scheduler, params IObservable[] sources) + { + if (scheduler == null) + { + throw new ArgumentNullException(nameof(scheduler)); + } + + if (sources == null) + { + throw new ArgumentNullException(nameof(sources)); + } + + return s_impl.Merge(scheduler, sources); + } + + /// + /// Merges elements from all observable sequences in the given enumerable sequence into a single observable sequence. + /// + /// The type of the elements in the source sequences. + /// Enumerable sequence of observable sequences. + /// The observable sequence that merges the elements of the observable sequences. + /// is null. + public static IObservable Merge(this IEnumerable> sources) + { + if (sources == null) + { + throw new ArgumentNullException(nameof(sources)); + } + + return s_impl.Merge(sources); + } + + /// + /// Merges elements from all observable sequences in the given enumerable sequence into a single observable sequence, using the specified scheduler for enumeration of and subscription to the sources. + /// + /// The type of the elements in the source sequences. + /// Enumerable sequence of observable sequences. + /// Scheduler to run the enumeration of the sequence of sources on. + /// The observable sequence that merges the elements of the observable sequences. + /// or is null. + public static IObservable Merge(this IEnumerable> sources, IScheduler scheduler) + { + if (sources == null) + { + throw new ArgumentNullException(nameof(sources)); + } + + if (scheduler == null) + { + throw new ArgumentNullException(nameof(scheduler)); + } + + return s_impl.Merge(sources, scheduler); + } + + #endregion + + #region + OnErrorResumeNext + + + /// + /// Concatenates the second observable sequence to the first observable sequence upon successful or exceptional termination of the first. + /// + /// The type of the elements in the source sequences. + /// First observable sequence whose exception (if any) is caught. + /// Second observable sequence used to produce results after the first sequence terminates. + /// An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally. + /// or is null. + public static IObservable OnErrorResumeNext(this IObservable first, IObservable second) + { + if (first == null) + { + throw new ArgumentNullException(nameof(first)); + } + + if (second == null) + { + throw new ArgumentNullException(nameof(second)); + } + + return s_impl.OnErrorResumeNext(first, second); + } + + /// + /// Concatenates all of the specified observable sequences, even if the previous observable sequence terminated exceptionally. + /// + /// The type of the elements in the source sequences. + /// Observable sequences to concatenate. + /// An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally. + /// is null. + public static IObservable OnErrorResumeNext(params IObservable[] sources) + { + if (sources == null) + { + throw new ArgumentNullException(nameof(sources)); + } + + return s_impl.OnErrorResumeNext(sources); + } + + /// + /// Concatenates all observable sequences in the given enumerable sequence, even if the previous observable sequence terminated exceptionally. + /// + /// The type of the elements in the source sequences. + /// Observable sequences to concatenate. + /// An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally. + /// is null. + public static IObservable OnErrorResumeNext(this IEnumerable> sources) + { + if (sources == null) + { + throw new ArgumentNullException(nameof(sources)); + } + + return s_impl.OnErrorResumeNext(sources); + } + + #endregion + + #region + SkipUntil + + + /// + /// Returns the elements from the source observable sequence only after the other observable sequence produces an element. + /// Starting from Rx.NET 4.0, this will subscribe to before subscribing to + /// so in case emits an element right away, elements from are not missed. + /// + /// The type of the elements in the source sequence. + /// The type of the elements in the other sequence that indicates the end of skip behavior. + /// Source sequence to propagate elements for. + /// Observable sequence that triggers propagation of elements of the source sequence. + /// An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation. + /// or is null. + public static IObservable SkipUntil(this IObservable source, IObservable other) { - #region + Amb + - - /// - /// Propagates the observable sequence that reacts first. - /// - /// The type of the elements in the source sequences. - /// First observable sequence. - /// Second observable sequence. - /// An observable sequence that surfaces either of the given sequences, whichever reacted first. - /// or is null. - [Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Amb", Justification = "In honor of McCarthy.")] - public static IObservable Amb(this IObservable first, IObservable second) - { - if (first == null) - { - throw new ArgumentNullException(nameof(first)); - } - - if (second == null) - { - throw new ArgumentNullException(nameof(second)); - } - - return s_impl.Amb(first, second); - } - - /// - /// Propagates the observable sequence that reacts first. - /// - /// The type of the elements in the source sequences. - /// Observable sources competing to react first. - /// An observable sequence that surfaces any of the given sequences, whichever reacted first. - /// is null. - [Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Amb", Justification = "In honor of McCarthy.")] - public static IObservable Amb(params IObservable[] sources) - { - if (sources == null) - { - throw new ArgumentNullException(nameof(sources)); - } - - return s_impl.Amb(sources); - } - - /// - /// Propagates the observable sequence that reacts first. - /// - /// The type of the elements in the source sequences. - /// Observable sources competing to react first. - /// An observable sequence that surfaces any of the given sequences, whichever reacted first. - /// is null. - [Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Amb", Justification = "In honor of McCarthy.")] - public static IObservable Amb(this IEnumerable> sources) - { - if (sources == null) - { - throw new ArgumentNullException(nameof(sources)); - } - - return s_impl.Amb(sources); - } - - #endregion - - #region + Buffer + - - /// - /// Projects each element of an observable sequence into consecutive non-overlapping buffers. - /// - /// The type of the elements in the source sequence, and in the lists in the result sequence. - /// The type of the elements in the sequences indicating buffer closing events. - /// Source sequence to produce buffers over. - /// A function invoked to define the boundaries of the produced buffers. A new buffer is started when the previous one is closed. - /// An observable sequence of buffers. - /// or is null. - public static IObservable> Buffer(this IObservable source, Func> bufferClosingSelector) - { - if (source == null) - { - throw new ArgumentNullException(nameof(source)); - } - - if (bufferClosingSelector == null) - { - throw new ArgumentNullException(nameof(bufferClosingSelector)); - } - - return s_impl.Buffer(source, bufferClosingSelector); - } - - /// - /// Projects each element of an observable sequence into zero or more buffers. - /// - /// The type of the elements in the source sequence, and in the lists in the result sequence. - /// The type of the elements in the sequence indicating buffer opening events, also passed to the closing selector to obtain a sequence of buffer closing events. - /// The type of the elements in the sequences indicating buffer closing events. - /// Source sequence to produce buffers over. - /// Observable sequence whose elements denote the creation of new buffers. - /// A function invoked to define the closing of each produced buffer. - /// An observable sequence of buffers. - /// or or is null. - public static IObservable> Buffer(this IObservable source, IObservable bufferOpenings, Func> bufferClosingSelector) - { - if (source == null) - { - throw new ArgumentNullException(nameof(source)); - } - - if (bufferOpenings == null) - { - throw new ArgumentNullException(nameof(bufferOpenings)); - } - - if (bufferClosingSelector == null) - { - throw new ArgumentNullException(nameof(bufferClosingSelector)); - } - - return s_impl.Buffer(source, bufferOpenings, bufferClosingSelector); - } - - /// - /// Projects each element of an observable sequence into consecutive non-overlapping buffers. - /// - /// The type of the elements in the source sequence, and in the lists in the result sequence. - /// The type of the elements in the sequences indicating buffer boundary events. - /// Source sequence to produce buffers over. - /// Sequence of buffer boundary markers. The current buffer is closed and a new buffer is opened upon receiving a boundary marker. - /// An observable sequence of buffers. - /// or is null. - public static IObservable> Buffer(this IObservable source, IObservable bufferBoundaries) - { - if (source == null) - { - throw new ArgumentNullException(nameof(source)); - } - - if (bufferBoundaries == null) - { - throw new ArgumentNullException(nameof(bufferBoundaries)); - } - - return s_impl.Buffer(source, bufferBoundaries); - } - - #endregion - - #region + Catch + - - /// - /// Continues an observable sequence that is terminated by an exception of the specified type with the observable sequence produced by the handler. - /// - /// The type of the elements in the source sequence and sequences returned by the exception handler function. - /// The type of the exception to catch and handle. Needs to derive from . - /// Source sequence. - /// Exception handler function, producing another observable sequence. - /// An observable sequence containing the source sequence's elements, followed by the elements produced by the handler's resulting observable sequence in case an exception occurred. - /// or is null. - public static IObservable Catch(this IObservable source, Func> handler) where TException : Exception - { - if (source == null) - { - throw new ArgumentNullException(nameof(source)); - } - - if (handler == null) - { - throw new ArgumentNullException(nameof(handler)); - } - - return s_impl.Catch(source, handler); - } - - /// - /// Continues an observable sequence that is terminated by an exception with the next observable sequence. - /// - /// The type of the elements in the source sequence and handler sequence. - /// First observable sequence whose exception (if any) is caught. - /// Second observable sequence used to produce results when an error occurred in the first sequence. - /// An observable sequence containing the first sequence's elements, followed by the elements of the second sequence in case an exception occurred. - /// or is null. - public static IObservable Catch(this IObservable first, IObservable second) - { - if (first == null) - { - throw new ArgumentNullException(nameof(first)); - } - - if (second == null) - { - throw new ArgumentNullException(nameof(second)); - } - - return s_impl.Catch(first, second); - } - - /// - /// Continues an observable sequence that is terminated by an exception with the next observable sequence. - /// - /// The type of the elements in the source and handler sequences. - /// Observable sequences to catch exceptions for. - /// An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully. - /// is null. - public static IObservable Catch(params IObservable[] sources) - { - if (sources == null) - { - throw new ArgumentNullException(nameof(sources)); - } - - return s_impl.Catch(sources); - } - - /// - /// Continues an observable sequence that is terminated by an exception with the next observable sequence. - /// - /// The type of the elements in the source and handler sequences. - /// Observable sequences to catch exceptions for. - /// An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully. - /// is null. - public static IObservable Catch(this IEnumerable> sources) - { - if (sources == null) - { - throw new ArgumentNullException(nameof(sources)); - } - - return s_impl.Catch(sources); - } - - #endregion - - #region + CombineLatest + - - /// - /// Merges two observable sequences into one observable sequence by using the selector function whenever one of the observable sequences produces an element. - /// - /// The type of the elements in the first source sequence. - /// The type of the elements in the second source sequence. - /// The type of the elements in the result sequence, returned by the selector function. - /// First observable source. - /// Second observable source. - /// Function to invoke whenever either of the sources produces an element. - /// An observable sequence containing the result of combining elements of both sources using the specified result selector function. - /// or or is null. - /// If a non-empty source completes, its very last value will be used for creating subsequent combinations until all sources terminate. - public static IObservable CombineLatest(this IObservable first, IObservable second, Func resultSelector) - { - if (first == null) - { - throw new ArgumentNullException(nameof(first)); - } - - if (second == null) - { - throw new ArgumentNullException(nameof(second)); - } - - if (resultSelector == null) - { - throw new ArgumentNullException(nameof(resultSelector)); - } - - return s_impl.CombineLatest(first, second, resultSelector); - } - - /// - /// Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. - /// - /// The type of the elements in the source sequences. - /// The type of the elements in the result sequence, returned by the selector function. - /// Observable sources. - /// Function to invoke whenever any of the sources produces an element. For efficiency, the input list is reused after the selector returns. Either aggregate or copy the values during the function call. - /// An observable sequence containing the result of combining elements of the sources using the specified result selector function. - /// or is null. - /// If a non-empty source completes, its very last value will be used for creating subsequent combinations until all sources terminate. - public static IObservable CombineLatest(this IEnumerable> sources, Func, TResult> resultSelector) - { - if (sources == null) - { - throw new ArgumentNullException(nameof(sources)); - } - - if (resultSelector == null) - { - throw new ArgumentNullException(nameof(resultSelector)); - } - - return s_impl.CombineLatest(sources, resultSelector); - } - - /// - /// Merges the specified observable sequences into one observable sequence by emitting a list with the latest source elements whenever any of the observable sequences produces an element. - /// - /// The type of the elements in the source sequences, and in the lists in the result sequence. - /// Observable sources. - /// An observable sequence containing lists of the latest elements of the sources. - /// is null. - /// If a non-empty source completes, its very last value will be used for creating subsequent combinations until all sources terminate. - public static IObservable> CombineLatest(this IEnumerable> sources) - { - if (sources == null) - { - throw new ArgumentNullException(nameof(sources)); - } - - return s_impl.CombineLatest(sources); - } - - /// - /// Merges the specified observable sequences into one observable sequence by emitting a list with the latest source elements whenever any of the observable sequences produces an element. - /// - /// The type of the elements in the source sequences, and in the lists in the result sequence. - /// Observable sources. - /// An observable sequence containing lists of the latest elements of the sources. - /// is null. - /// If a non-empty source completes, its very last value will be used for creating subsequent combinations until all sources terminate. - public static IObservable> CombineLatest(params IObservable[] sources) - { - if (sources == null) - { - throw new ArgumentNullException(nameof(sources)); - } - - return s_impl.CombineLatest(sources); - } - - #endregion - - #region + Concat + - - /// - /// Concatenates the second observable sequence to the first observable sequence upon successful termination of the first. - /// - /// The type of the elements in the source sequences. - /// First observable sequence. - /// Second observable sequence. - /// An observable sequence that contains the elements of the first sequence, followed by those of the second the sequence. - /// or is null. - public static IObservable Concat(this IObservable first, IObservable second) - { - if (first == null) - { - throw new ArgumentNullException(nameof(first)); - } - - if (second == null) - { - throw new ArgumentNullException(nameof(second)); - } - - return s_impl.Concat(first, second); - } - - /// - /// Concatenates all of the specified observable sequences, as long as the previous observable sequence terminated successfully. - /// - /// The type of the elements in the source sequences. - /// Observable sequences to concatenate. - /// An observable sequence that contains the elements of each given sequence, in sequential order. - /// is null. - public static IObservable Concat(params IObservable[] sources) - { - if (sources == null) - { - throw new ArgumentNullException(nameof(sources)); - } - - return s_impl.Concat(sources); - } - - /// - /// Concatenates all observable sequences in the given enumerable sequence, as long as the previous observable sequence terminated successfully. - /// - /// The type of the elements in the source sequences. - /// Observable sequences to concatenate. - /// An observable sequence that contains the elements of each given sequence, in sequential order. - /// is null. - public static IObservable Concat(this IEnumerable> sources) - { - if (sources == null) - { - throw new ArgumentNullException(nameof(sources)); - } - - return s_impl.Concat(sources); - } - - /// - /// Concatenates all inner observable sequences, as long as the previous observable sequence terminated successfully. - /// - /// The type of the elements in the source sequences. - /// Observable sequence of inner observable sequences. - /// An observable sequence that contains the elements of each observed inner sequence, in sequential order. - /// is null. - public static IObservable Concat(this IObservable> sources) - { - if (sources == null) - { - throw new ArgumentNullException(nameof(sources)); - } - - return s_impl.Concat(sources); - } - - /// - /// Concatenates all task results, as long as the previous task terminated successfully. - /// - /// The type of the results produced by the tasks. - /// Observable sequence of tasks. - /// An observable sequence that contains the results of each task, in sequential order. - /// is null. - /// If the tasks support cancellation, consider manual conversion of the tasks using , followed by a concatenation operation using . - public static IObservable Concat(this IObservable> sources) - { - if (sources == null) - { - throw new ArgumentNullException(nameof(sources)); - } - - return s_impl.Concat(sources); - } - - #endregion - - #region + Merge + - - /// - /// Merges elements from all inner observable sequences into a single observable sequence. - /// - /// The type of the elements in the source sequences. - /// Observable sequence of inner observable sequences. - /// The observable sequence that merges the elements of the inner sequences. - /// is null. - public static IObservable Merge(this IObservable> sources) - { - if (sources == null) - { - throw new ArgumentNullException(nameof(sources)); - } - - return s_impl.Merge(sources); - } - - /// - /// Merges results from all source tasks into a single observable sequence. - /// - /// The type of the results produced by the source tasks. - /// Observable sequence of tasks. - /// The observable sequence that merges the results of the source tasks. - /// is null. - /// If the tasks support cancellation, consider manual conversion of the tasks using , followed by a merge operation using . - public static IObservable Merge(this IObservable> sources) - { - if (sources == null) - { - throw new ArgumentNullException(nameof(sources)); - } - - return s_impl.Merge(sources); - } - - /// - /// Merges elements from all inner observable sequences into a single observable sequence, limiting the number of concurrent subscriptions to inner sequences. - /// - /// The type of the elements in the source sequences. - /// Observable sequence of inner observable sequences. - /// Maximum number of inner observable sequences being subscribed to concurrently. - /// The observable sequence that merges the elements of the inner sequences. - /// is null. - /// is less than or equal to zero. - public static IObservable Merge(this IObservable> sources, int maxConcurrent) - { - if (sources == null) - { - throw new ArgumentNullException(nameof(sources)); - } - - if (maxConcurrent <= 0) - { - throw new ArgumentOutOfRangeException(nameof(maxConcurrent)); - } - - return s_impl.Merge(sources, maxConcurrent); - } - - /// - /// Merges elements from all observable sequences in the given enumerable sequence into a single observable sequence, limiting the number of concurrent subscriptions to inner sequences. - /// - /// The type of the elements in the source sequences. - /// Enumerable sequence of observable sequences. - /// Maximum number of observable sequences being subscribed to concurrently. - /// The observable sequence that merges the elements of the observable sequences. - /// is null. - /// is less than or equal to zero. - public static IObservable Merge(this IEnumerable> sources, int maxConcurrent) - { - if (sources == null) - { - throw new ArgumentNullException(nameof(sources)); - } - - if (maxConcurrent <= 0) - { - throw new ArgumentOutOfRangeException(nameof(maxConcurrent)); - } - - return s_impl.Merge(sources, maxConcurrent); - } - - /// - /// Merges elements from all observable sequences in the given enumerable sequence into a single observable sequence, limiting the number of concurrent subscriptions to inner sequences, and using the specified scheduler for enumeration of and subscription to the sources. - /// - /// The type of the elements in the source sequences. - /// Enumerable sequence of observable sequences. - /// Maximum number of observable sequences being subscribed to concurrently. - /// Scheduler to run the enumeration of the sequence of sources on. - /// The observable sequence that merges the elements of the observable sequences. - /// or is null. - /// is less than or equal to zero. - public static IObservable Merge(this IEnumerable> sources, int maxConcurrent, IScheduler scheduler) - { - if (sources == null) - { - throw new ArgumentNullException(nameof(sources)); - } - - if (maxConcurrent <= 0) - { - throw new ArgumentOutOfRangeException(nameof(maxConcurrent)); - } - - if (scheduler == null) - { - throw new ArgumentNullException(nameof(scheduler)); - } - - return s_impl.Merge(sources, maxConcurrent, scheduler); - } - - /// - /// Merges elements from two observable sequences into a single observable sequence. - /// - /// The type of the elements in the source sequences. - /// First observable sequence. - /// Second observable sequence. - /// The observable sequence that merges the elements of the given sequences. - /// or is null. - public static IObservable Merge(this IObservable first, IObservable second) - { - if (first == null) - { - throw new ArgumentNullException(nameof(first)); - } - - if (second == null) - { - throw new ArgumentNullException(nameof(second)); - } - - return s_impl.Merge(first, second); - } - - /// - /// Merges elements from two observable sequences into a single observable sequence, using the specified scheduler for enumeration of and subscription to the sources. - /// - /// The type of the elements in the source sequences. - /// First observable sequence. - /// Second observable sequence. - /// Scheduler used to introduce concurrency for making subscriptions to the given sequences. - /// The observable sequence that merges the elements of the given sequences. - /// or or is null. - public static IObservable Merge(this IObservable first, IObservable second, IScheduler scheduler) - { - if (first == null) - { - throw new ArgumentNullException(nameof(first)); - } - - if (second == null) - { - throw new ArgumentNullException(nameof(second)); - } - - if (scheduler == null) - { - throw new ArgumentNullException(nameof(scheduler)); - } - - return s_impl.Merge(first, second, scheduler); - } - - /// - /// Merges elements from all of the specified observable sequences into a single observable sequence. - /// - /// The type of the elements in the source sequences. - /// Observable sequences. - /// The observable sequence that merges the elements of the observable sequences. - /// is null. - public static IObservable Merge(params IObservable[] sources) - { - if (sources == null) - { - throw new ArgumentNullException(nameof(sources)); - } - - return s_impl.Merge(sources); - } - - /// - /// Merges elements from all of the specified observable sequences into a single observable sequence, using the specified scheduler for enumeration of and subscription to the sources. - /// - /// The type of the elements in the source sequences. - /// Observable sequences. - /// Scheduler to run the enumeration of the sequence of sources on. - /// The observable sequence that merges the elements of the observable sequences. - /// or is null. - public static IObservable Merge(IScheduler scheduler, params IObservable[] sources) - { - if (scheduler == null) - { - throw new ArgumentNullException(nameof(scheduler)); - } - - if (sources == null) - { - throw new ArgumentNullException(nameof(sources)); - } - - return s_impl.Merge(scheduler, sources); - } - - /// - /// Merges elements from all observable sequences in the given enumerable sequence into a single observable sequence. - /// - /// The type of the elements in the source sequences. - /// Enumerable sequence of observable sequences. - /// The observable sequence that merges the elements of the observable sequences. - /// is null. - public static IObservable Merge(this IEnumerable> sources) - { - if (sources == null) - { - throw new ArgumentNullException(nameof(sources)); - } - - return s_impl.Merge(sources); - } - - /// - /// Merges elements from all observable sequences in the given enumerable sequence into a single observable sequence, using the specified scheduler for enumeration of and subscription to the sources. - /// - /// The type of the elements in the source sequences. - /// Enumerable sequence of observable sequences. - /// Scheduler to run the enumeration of the sequence of sources on. - /// The observable sequence that merges the elements of the observable sequences. - /// or is null. - public static IObservable Merge(this IEnumerable> sources, IScheduler scheduler) - { - if (sources == null) - { - throw new ArgumentNullException(nameof(sources)); - } - - if (scheduler == null) - { - throw new ArgumentNullException(nameof(scheduler)); - } - - return s_impl.Merge(sources, scheduler); - } - - #endregion - - #region + OnErrorResumeNext + - - /// - /// Concatenates the second observable sequence to the first observable sequence upon successful or exceptional termination of the first. - /// - /// The type of the elements in the source sequences. - /// First observable sequence whose exception (if any) is caught. - /// Second observable sequence used to produce results after the first sequence terminates. - /// An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally. - /// or is null. - public static IObservable OnErrorResumeNext(this IObservable first, IObservable second) - { - if (first == null) - { - throw new ArgumentNullException(nameof(first)); - } - - if (second == null) - { - throw new ArgumentNullException(nameof(second)); - } - - return s_impl.OnErrorResumeNext(first, second); - } - - /// - /// Concatenates all of the specified observable sequences, even if the previous observable sequence terminated exceptionally. - /// - /// The type of the elements in the source sequences. - /// Observable sequences to concatenate. - /// An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally. - /// is null. - public static IObservable OnErrorResumeNext(params IObservable[] sources) - { - if (sources == null) - { - throw new ArgumentNullException(nameof(sources)); - } - - return s_impl.OnErrorResumeNext(sources); - } - - /// - /// Concatenates all observable sequences in the given enumerable sequence, even if the previous observable sequence terminated exceptionally. - /// - /// The type of the elements in the source sequences. - /// Observable sequences to concatenate. - /// An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally. - /// is null. - public static IObservable OnErrorResumeNext(this IEnumerable> sources) - { - if (sources == null) - { - throw new ArgumentNullException(nameof(sources)); - } - - return s_impl.OnErrorResumeNext(sources); - } - - #endregion - - #region + SkipUntil + - - /// - /// Returns the elements from the source observable sequence only after the other observable sequence produces an element. - /// Starting from Rx.NET 4.0, this will subscribe to before subscribing to - /// so in case emits an element right away, elements from are not missed. - /// - /// The type of the elements in the source sequence. - /// The type of the elements in the other sequence that indicates the end of skip behavior. - /// Source sequence to propagate elements for. - /// Observable sequence that triggers propagation of elements of the source sequence. - /// An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation. - /// or is null. - public static IObservable SkipUntil(this IObservable source, IObservable other) - { - if (source == null) - { - throw new ArgumentNullException(nameof(source)); - } - - if (other == null) - { - throw new ArgumentNullException(nameof(other)); - } - - return s_impl.SkipUntil(source, other); - } - - #endregion - - #region + Switch + - - /// - /// Transforms an observable sequence of observable sequences into an observable sequence - /// producing values only from the most recent observable sequence. - /// Each time a new inner observable sequence is received, unsubscribe from the - /// previous inner observable sequence. - /// - /// The type of the elements in the source sequences. - /// Observable sequence of inner observable sequences. - /// The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received. - /// is null. - public static IObservable Switch(this IObservable> sources) - { - if (sources == null) - { - throw new ArgumentNullException(nameof(sources)); - } - - return s_impl.Switch(sources); - } - - /// - /// Transforms an observable sequence of tasks into an observable sequence - /// producing values only from the most recent observable sequence. - /// Each time a new task is received, the previous task's result is ignored. - /// - /// The type of the results produced by the source tasks. - /// Observable sequence of tasks. - /// The observable sequence that at any point in time produces the result of the most recent task that has been received. - /// is null. - /// If the tasks support cancellation, consider manual conversion of the tasks using , followed by a switch operation using . - public static IObservable Switch(this IObservable> sources) - { - if (sources == null) - { - throw new ArgumentNullException(nameof(sources)); - } - - return s_impl.Switch(sources); - } - - #endregion - - #region + TakeUntil + - - /// - /// Returns the elements from the source observable sequence until the other observable sequence produces an element. - /// - /// The type of the elements in the source sequence. - /// The type of the elements in the other sequence that indicates the end of take behavior. - /// Source sequence to propagate elements for. - /// Observable sequence that terminates propagation of elements of the source sequence. - /// An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation. - /// or is null. - public static IObservable TakeUntil(this IObservable source, IObservable other) - { - if (source == null) - { - throw new ArgumentNullException(nameof(source)); - } - - if (other == null) - { - throw new ArgumentNullException(nameof(other)); - } - - return s_impl.TakeUntil(source, other); - } - - /// - /// Relays elements from the source observable sequence and calls the predicate after an - /// emission to check if the sequence should stop after that specific item. - /// - /// The type of the elements in the source and result sequences. - /// The source sequence to relay elements of. - /// Called after each upstream item has been emitted with - /// that upstream item and should return true to indicate the sequence should - /// complete. - /// The observable sequence with the source elements until the stop predicate returns true. - /// - /// The following sequence will stop after the value 5 has been encountered: - /// - /// Observable.Range(1, 10) - /// .TakeUntil(item => item == 5) - /// .Subscribe(Console.WriteLine); - /// - /// - /// If or is null. - public static IObservable TakeUntil(this IObservable source, Func stopPredicate) - { - if (source == null) - { - throw new ArgumentNullException(nameof(source)); - } - - if (stopPredicate == null) - { - throw new ArgumentNullException(nameof(stopPredicate)); - } - - return s_impl.TakeUntil(source, stopPredicate); - } - - #endregion - - #region + Window + - - /// - /// Projects each element of an observable sequence into consecutive non-overlapping windows. - /// - /// The type of the elements in the source sequence, and in the windows in the result sequence. - /// The type of the elements in the sequences indicating window closing events. - /// Source sequence to produce windows over. - /// A function invoked to define the boundaries of the produced windows. A new window is started when the previous one is closed. - /// An observable sequence of windows. - /// or is null. - public static IObservable> Window(this IObservable source, Func> windowClosingSelector) - { - if (source == null) - { - throw new ArgumentNullException(nameof(source)); - } - - if (windowClosingSelector == null) - { - throw new ArgumentNullException(nameof(windowClosingSelector)); - } - - return s_impl.Window(source, windowClosingSelector); - } - - /// - /// Projects each element of an observable sequence into zero or more windows. - /// - /// The type of the elements in the source sequence, and in the windows in the result sequence. - /// The type of the elements in the sequence indicating window opening events, also passed to the closing selector to obtain a sequence of window closing events. - /// The type of the elements in the sequences indicating window closing events. - /// Source sequence to produce windows over. - /// Observable sequence whose elements denote the creation of new windows. - /// A function invoked to define the closing of each produced window. - /// An observable sequence of windows. - /// or or is null. - public static IObservable> Window(this IObservable source, IObservable windowOpenings, Func> windowClosingSelector) - { - if (source == null) - { - throw new ArgumentNullException(nameof(source)); - } - - if (windowOpenings == null) - { - throw new ArgumentNullException(nameof(windowOpenings)); - } - - if (windowClosingSelector == null) - { - throw new ArgumentNullException(nameof(windowClosingSelector)); - } - - return s_impl.Window(source, windowOpenings, windowClosingSelector); - } - - /// - /// Projects each element of an observable sequence into consecutive non-overlapping windows. - /// - /// The type of the elements in the source sequence, and in the windows in the result sequence. - /// The type of the elements in the sequences indicating window boundary events. - /// Source sequence to produce windows over. - /// Sequence of window boundary markers. The current window is closed and a new window is opened upon receiving a boundary marker. - /// An observable sequence of windows. - /// or is null. - public static IObservable> Window(this IObservable source, IObservable windowBoundaries) - { - if (source == null) - { - throw new ArgumentNullException(nameof(source)); - } - - if (windowBoundaries == null) - { - throw new ArgumentNullException(nameof(windowBoundaries)); - } - - return s_impl.Window(source, windowBoundaries); - } - - #endregion - - #region + WithLatestFrom + - - /// - /// Merges two observable sequences into one observable sequence by combining each element from the first source with the latest element from the second source, if any. - /// Starting from Rx.NET 4.0, this will subscribe to before subscribing to to have a latest element readily available - /// in case emits an element right away. - /// - /// The type of the elements in the first source sequence. - /// The type of the elements in the second source sequence. - /// The type of the elements in the result sequence, returned by the selector function. - /// First observable source. - /// Second observable source. - /// Function to invoke for each element from the first source combined with the latest element from the second source, if any. - /// An observable sequence containing the result of combining each element of the first source with the latest element from the second source, if any, using the specified result selector function. - /// or or is null. - public static IObservable WithLatestFrom(this IObservable first, IObservable second, Func resultSelector) - { - if (first == null) - { - throw new ArgumentNullException(nameof(first)); - } - - if (second == null) - { - throw new ArgumentNullException(nameof(second)); - } - - if (resultSelector == null) - { - throw new ArgumentNullException(nameof(resultSelector)); - } - - return s_impl.WithLatestFrom(first, second, resultSelector); - } - - #endregion - - #region + Zip + - - /// - /// Merges two observable sequences into one observable sequence by combining their elements in a pairwise fashion. - /// - /// The type of the elements in the first source sequence. - /// The type of the elements in the second source sequence. - /// The type of the elements in the result sequence, returned by the selector function. - /// First observable source. - /// Second observable source. - /// Function to invoke for each consecutive pair of elements from the first and second source. - /// An observable sequence containing the result of pairwise combining the elements of the first and second source using the specified result selector function. - /// or or is null. - public static IObservable Zip(this IObservable first, IObservable second, Func resultSelector) - { - if (first == null) - { - throw new ArgumentNullException(nameof(first)); - } - - if (second == null) - { - throw new ArgumentNullException(nameof(second)); - } - - if (resultSelector == null) - { - throw new ArgumentNullException(nameof(resultSelector)); - } - - return s_impl.Zip(first, second, resultSelector); - } - - /// - /// Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. - /// - /// The type of the elements in the source sequences. - /// The type of the elements in the result sequence, returned by the selector function. - /// Observable sources. - /// Function to invoke for each series of elements at corresponding indexes in the sources. - /// An observable sequence containing the result of combining elements of the sources using the specified result selector function. - /// or is null. - public static IObservable Zip(this IEnumerable> sources, Func, TResult> resultSelector) - { - if (sources == null) - { - throw new ArgumentNullException(nameof(sources)); - } - - if (resultSelector == null) - { - throw new ArgumentNullException(nameof(resultSelector)); - } - - return s_impl.Zip(sources, resultSelector); - } - - /// - /// Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes. - /// - /// The type of the elements in the source sequences, and in the lists in the result sequence. - /// Observable sources. - /// An observable sequence containing lists of elements at corresponding indexes. - /// is null. - public static IObservable> Zip(this IEnumerable> sources) - { - if (sources == null) - { - throw new ArgumentNullException(nameof(sources)); - } - - return s_impl.Zip(sources); - } - - /// - /// Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes. - /// - /// The type of the elements in the source sequences, and in the lists in the result sequence. - /// Observable sources. - /// An observable sequence containing lists of elements at corresponding indexes. - /// is null. - public static IObservable> Zip(params IObservable[] sources) - { - if (sources == null) - { - throw new ArgumentNullException(nameof(sources)); - } - - return s_impl.Zip(sources); - } - - /// - /// Merges an observable sequence and an enumerable sequence into one observable sequence by using the selector function. - /// - /// The type of the elements in the first observable source sequence. - /// The type of the elements in the second enumerable source sequence. - /// The type of the elements in the result sequence, returned by the selector function. - /// First observable source. - /// Second enumerable source. - /// Function to invoke for each consecutive pair of elements from the first and second source. - /// An observable sequence containing the result of pairwise combining the elements of the first and second source using the specified result selector function. - /// or or is null. - public static IObservable Zip(this IObservable first, IEnumerable second, Func resultSelector) - { - if (first == null) - { - throw new ArgumentNullException(nameof(first)); - } - - if (second == null) - { - throw new ArgumentNullException(nameof(second)); - } - - if (resultSelector == null) - { - throw new ArgumentNullException(nameof(resultSelector)); - } - - return s_impl.Zip(first, second, resultSelector); - } - - #endregion + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + if (other == null) + { + throw new ArgumentNullException(nameof(other)); + } + + return s_impl.SkipUntil(source, other); } + #endregion + + #region + Switch + + + /// + /// Transforms an observable sequence of observable sequences into an observable sequence + /// producing values only from the most recent observable sequence. + /// Each time a new inner observable sequence is received, unsubscribe from the + /// previous inner observable sequence. + /// + /// The type of the elements in the source sequences. + /// Observable sequence of inner observable sequences. + /// The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received. + /// is null. + public static IObservable Switch(this IObservable> sources) + { + if (sources == null) + { + throw new ArgumentNullException(nameof(sources)); + } + + return s_impl.Switch(sources); + } + + /// + /// Transforms an observable sequence of tasks into an observable sequence + /// producing values only from the most recent observable sequence. + /// Each time a new task is received, the previous task's result is ignored. + /// + /// The type of the results produced by the source tasks. + /// Observable sequence of tasks. + /// The observable sequence that at any point in time produces the result of the most recent task that has been received. + /// is null. + /// If the tasks support cancellation, consider manual conversion of the tasks using , followed by a switch operation using . + public static IObservable Switch(this IObservable> sources) + { + if (sources == null) + { + throw new ArgumentNullException(nameof(sources)); + } + + return s_impl.Switch(sources); + } + + #endregion + + #region + TakeUntil + + + /// + /// Returns the elements from the source observable sequence until the other observable sequence produces an element. + /// + /// The type of the elements in the source sequence. + /// The type of the elements in the other sequence that indicates the end of take behavior. + /// Source sequence to propagate elements for. + /// Observable sequence that terminates propagation of elements of the source sequence. + /// An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation. + /// or is null. + public static IObservable TakeUntil(this IObservable source, IObservable other) + { + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + if (other == null) + { + throw new ArgumentNullException(nameof(other)); + } + + return s_impl.TakeUntil(source, other); + } + + /// + /// Relays elements from the source observable sequence and calls the predicate after an + /// emission to check if the sequence should stop after that specific item. + /// + /// The type of the elements in the source and result sequences. + /// The source sequence to relay elements of. + /// Called after each upstream item has been emitted with + /// that upstream item and should return true to indicate the sequence should + /// complete. + /// The observable sequence with the source elements until the stop predicate returns true. + /// + /// The following sequence will stop after the value 5 has been encountered: + /// + /// Observable.Range(1, 10) + /// .TakeUntil(item => item == 5) + /// .Subscribe(Console.WriteLine); + /// + /// + /// If or is null. + public static IObservable TakeUntil(this IObservable source, Func stopPredicate) + { + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + if (stopPredicate == null) + { + throw new ArgumentNullException(nameof(stopPredicate)); + } + + return s_impl.TakeUntil(source, stopPredicate); + } + + /// + /// Relays elements from the source observable sequence until the provided is canceled. + /// Completes immediately if the provided is already canceled upon subscription. + /// + /// The type of the elements in the source and result sequences. + /// The source sequence to relay elements of. + /// The cancellation token to complete the target observable sequence on. + /// The observable sequence with the source elements until the provided is canceled. + /// If is null. + public static IObservable TakeUntil(this IObservable source, CancellationToken cancellationToken) + { + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + return s_impl.TakeUntil(source, cancellationToken); + } + + #endregion + + #region + Window + + + /// + /// Projects each element of an observable sequence into consecutive non-overlapping windows. + /// + /// The type of the elements in the source sequence, and in the windows in the result sequence. + /// The type of the elements in the sequences indicating window closing events. + /// Source sequence to produce windows over. + /// A function invoked to define the boundaries of the produced windows. A new window is started when the previous one is closed. + /// An observable sequence of windows. + /// or is null. + public static IObservable> Window(this IObservable source, Func> windowClosingSelector) + { + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + if (windowClosingSelector == null) + { + throw new ArgumentNullException(nameof(windowClosingSelector)); + } + + return s_impl.Window(source, windowClosingSelector); + } + + /// + /// Projects each element of an observable sequence into zero or more windows. + /// + /// The type of the elements in the source sequence, and in the windows in the result sequence. + /// The type of the elements in the sequence indicating window opening events, also passed to the closing selector to obtain a sequence of window closing events. + /// The type of the elements in the sequences indicating window closing events. + /// Source sequence to produce windows over. + /// Observable sequence whose elements denote the creation of new windows. + /// A function invoked to define the closing of each produced window. + /// An observable sequence of windows. + /// or or is null. + public static IObservable> Window(this IObservable source, IObservable windowOpenings, Func> windowClosingSelector) + { + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + if (windowOpenings == null) + { + throw new ArgumentNullException(nameof(windowOpenings)); + } + + if (windowClosingSelector == null) + { + throw new ArgumentNullException(nameof(windowClosingSelector)); + } + + return s_impl.Window(source, windowOpenings, windowClosingSelector); + } + + /// + /// Projects each element of an observable sequence into consecutive non-overlapping windows. + /// + /// The type of the elements in the source sequence, and in the windows in the result sequence. + /// The type of the elements in the sequences indicating window boundary events. + /// Source sequence to produce windows over. + /// Sequence of window boundary markers. The current window is closed and a new window is opened upon receiving a boundary marker. + /// An observable sequence of windows. + /// or is null. + public static IObservable> Window(this IObservable source, IObservable windowBoundaries) + { + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + if (windowBoundaries == null) + { + throw new ArgumentNullException(nameof(windowBoundaries)); + } + + return s_impl.Window(source, windowBoundaries); + } + + #endregion + + #region + WithLatestFrom + + + /// + /// Merges two observable sequences into one observable sequence by combining each element from the first source with the latest element from the second source, if any. + /// Starting from Rx.NET 4.0, this will subscribe to before subscribing to to have a latest element readily available + /// in case emits an element right away. + /// + /// The type of the elements in the first source sequence. + /// The type of the elements in the second source sequence. + /// The type of the elements in the result sequence, returned by the selector function. + /// First observable source. + /// Second observable source. + /// Function to invoke for each element from the first source combined with the latest element from the second source, if any. + /// An observable sequence containing the result of combining each element of the first source with the latest element from the second source, if any, using the specified result selector function. + /// or or is null. + public static IObservable WithLatestFrom(this IObservable first, IObservable second, Func resultSelector) + { + if (first == null) + { + throw new ArgumentNullException(nameof(first)); + } + + if (second == null) + { + throw new ArgumentNullException(nameof(second)); + } + + if (resultSelector == null) + { + throw new ArgumentNullException(nameof(resultSelector)); + } + + return s_impl.WithLatestFrom(first, second, resultSelector); + } + + #endregion + + #region + Zip + + + /// + /// Merges two observable sequences into one observable sequence by combining their elements in a pairwise fashion. + /// + /// The type of the elements in the first source sequence. + /// The type of the elements in the second source sequence. + /// The type of the elements in the result sequence, returned by the selector function. + /// First observable source. + /// Second observable source. + /// Function to invoke for each consecutive pair of elements from the first and second source. + /// An observable sequence containing the result of pairwise combining the elements of the first and second source using the specified result selector function. + /// or or is null. + public static IObservable Zip(this IObservable first, IObservable second, Func resultSelector) + { + if (first == null) + { + throw new ArgumentNullException(nameof(first)); + } + + if (second == null) + { + throw new ArgumentNullException(nameof(second)); + } + + if (resultSelector == null) + { + throw new ArgumentNullException(nameof(resultSelector)); + } + + return s_impl.Zip(first, second, resultSelector); + } + + /// + /// Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. + /// + /// The type of the elements in the source sequences. + /// The type of the elements in the result sequence, returned by the selector function. + /// Observable sources. + /// Function to invoke for each series of elements at corresponding indexes in the sources. + /// An observable sequence containing the result of combining elements of the sources using the specified result selector function. + /// or is null. + public static IObservable Zip(this IEnumerable> sources, Func, TResult> resultSelector) + { + if (sources == null) + { + throw new ArgumentNullException(nameof(sources)); + } + + if (resultSelector == null) + { + throw new ArgumentNullException(nameof(resultSelector)); + } + + return s_impl.Zip(sources, resultSelector); + } + + /// + /// Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes. + /// + /// The type of the elements in the source sequences, and in the lists in the result sequence. + /// Observable sources. + /// An observable sequence containing lists of elements at corresponding indexes. + /// is null. + public static IObservable> Zip(this IEnumerable> sources) + { + if (sources == null) + { + throw new ArgumentNullException(nameof(sources)); + } + + return s_impl.Zip(sources); + } + + /// + /// Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes. + /// + /// The type of the elements in the source sequences, and in the lists in the result sequence. + /// Observable sources. + /// An observable sequence containing lists of elements at corresponding indexes. + /// is null. + public static IObservable> Zip(params IObservable[] sources) + { + if (sources == null) + { + throw new ArgumentNullException(nameof(sources)); + } + + return s_impl.Zip(sources); + } + + /// + /// Merges an observable sequence and an enumerable sequence into one observable sequence by using the selector function. + /// + /// The type of the elements in the first observable source sequence. + /// The type of the elements in the second enumerable source sequence. + /// The type of the elements in the result sequence, returned by the selector function. + /// First observable source. + /// Second enumerable source. + /// Function to invoke for each consecutive pair of elements from the first and second source. + /// An observable sequence containing the result of pairwise combining the elements of the first and second source using the specified result selector function. + /// or or is null. + public static IObservable Zip(this IObservable first, IEnumerable second, Func resultSelector) + { + if (first == null) + { + throw new ArgumentNullException(nameof(first)); + } + + if (second == null) + { + throw new ArgumentNullException(nameof(second)); + } + + if (resultSelector == null) + { + throw new ArgumentNullException(nameof(resultSelector)); + } + + return s_impl.Zip(first, second, resultSelector); + } + + #endregion +} + #pragma warning disable CA1711 // (Don't use Ex suffix.) This has been a public type for many years, so we can't rename it now. - public static partial class ObservableEx +public static partial class ObservableEx #pragma warning restore CA1711 +{ + /// + /// Merges two observable sequences into one observable sequence by combining each element from the first source with the latest element from the second source, if any. + /// + /// The type of the elements in the first source sequence. + /// The type of the elements in the second source sequence. + /// First observable source. + /// Second observable source. + /// An observable sequence containing the result of combining each element of the first source with the latest element from the second source, if any, as a tuple value. + /// or is null. + public static IObservable<(TFirst First, TSecond Second)> WithLatestFrom(this IObservable first, IObservable second) + { + if (first == null) + { + throw new ArgumentNullException(nameof(first)); + } + + if (second == null) + { + throw new ArgumentNullException(nameof(second)); + } + + return s_impl.WithLatestFrom(first, second); + } + + /// + /// Merges an observable sequence and an enumerable sequence into one observable sequence of tuple values. + /// + /// The type of the elements in the first observable source sequence. + /// The type of the elements in the second enumerable source sequence. + /// First observable source. + /// Second enumerable source. + /// An observable sequence containing the result of pairwise combining the elements of the first and second source as a tuple value. + /// or is null. + public static IObservable<(TFirst First, TSecond Second)> Zip(this IObservable first, IEnumerable second) { - /// - /// Merges two observable sequences into one observable sequence by combining each element from the first source with the latest element from the second source, if any. - /// - /// The type of the elements in the first source sequence. - /// The type of the elements in the second source sequence. - /// First observable source. - /// Second observable source. - /// An observable sequence containing the result of combining each element of the first source with the latest element from the second source, if any, as a tuple value. - /// or is null. - public static IObservable<(TFirst First, TSecond Second)> WithLatestFrom(this IObservable first, IObservable second) - { - if (first == null) - { - throw new ArgumentNullException(nameof(first)); - } - - if (second == null) - { - throw new ArgumentNullException(nameof(second)); - } - - return s_impl.WithLatestFrom(first, second); - } - - /// - /// Merges an observable sequence and an enumerable sequence into one observable sequence of tuple values. - /// - /// The type of the elements in the first observable source sequence. - /// The type of the elements in the second enumerable source sequence. - /// First observable source. - /// Second enumerable source. - /// An observable sequence containing the result of pairwise combining the elements of the first and second source as a tuple value. - /// or is null. - public static IObservable<(TFirst First, TSecond Second)> Zip(this IObservable first, IEnumerable second) - { - if (first == null) - { - throw new ArgumentNullException(nameof(first)); - } - - if (second == null) - { - throw new ArgumentNullException(nameof(second)); - } - - return s_impl.Zip(first, second); + if (first == null) + { + throw new ArgumentNullException(nameof(first)); + } + + if (second == null) + { + throw new ArgumentNullException(nameof(second)); } + + return s_impl.Zip(first, second); } } diff --git a/Rx.NET/Source/src/System.Reactive/Linq/Observable/TakeUntilCancellationToken.cs b/Rx.NET/Source/src/System.Reactive/Linq/Observable/TakeUntilCancellationToken.cs new file mode 100644 index 000000000..ff45cadc4 --- /dev/null +++ b/Rx.NET/Source/src/System.Reactive/Linq/Observable/TakeUntilCancellationToken.cs @@ -0,0 +1,76 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT License. +// See the LICENSE file in the project root for more information. + +namespace System.Reactive.Linq.ObservableImpl; +using System; +using System.Reactive.Disposables; +using System.Threading; + +/// +/// Relays items to the downstream until the CancellationToken is cancled. +/// +/// The element type of the sequence +internal sealed class TakeUntilCancellationToken : + Producer._> +{ + private readonly IObservable _source; + private readonly CancellationToken _token; + + public TakeUntilCancellationToken(IObservable source, CancellationToken token) + { + _source = source; + _token = token; + } + + protected override _ CreateSink(IObserver observer) => new(observer); + + protected override void Run(_ sink) => sink.Run(this); + + internal sealed class _ : IdentitySink + { + private SingleAssignmentDisposableValue _cancellationTokenRegistration; + private int _wip; + private Exception? _error; + + public _(IObserver observer) : base(observer) + { + } + + public void Run(TakeUntilCancellationToken parent) + { + if (parent._token.IsCancellationRequested) + { + OnCompleted(); + return; + } + + _cancellationTokenRegistration.Disposable = parent._token.Register(OnCompleted); + Run(parent._source); + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + _cancellationTokenRegistration.Dispose(); + } + base.Dispose(disposing); + } + + public override void OnNext(TSource value) + { + HalfSerializer.ForwardOnNext(this, value, ref _wip, ref _error); + } + + public override void OnError(Exception error) + { + HalfSerializer.ForwardOnError(this, error, ref _wip, ref _error); + } + + public override void OnCompleted() + { + HalfSerializer.ForwardOnCompleted(this, ref _wip, ref _error); + } + } +} diff --git a/Rx.NET/Source/src/System.Reactive/Linq/QueryLanguage.Multiple.cs b/Rx.NET/Source/src/System.Reactive/Linq/QueryLanguage.Multiple.cs index 4a9d1b6d1..4f8289fa1 100644 --- a/Rx.NET/Source/src/System.Reactive/Linq/QueryLanguage.Multiple.cs +++ b/Rx.NET/Source/src/System.Reactive/Linq/QueryLanguage.Multiple.cs @@ -2,348 +2,352 @@ // The .NET Foundation licenses this file to you under the MIT License. // See the LICENSE file in the project root for more information. +namespace System.Reactive.Linq; + using System.Collections.Generic; using System.Linq; using System.Reactive.Concurrency; +using System.Reactive.Linq.ObservableImpl; using System.Reactive.Threading.Tasks; +using System.Threading; using System.Threading.Tasks; -namespace System.Reactive.Linq +internal partial class QueryLanguage { - using ObservableImpl; + #region + Amb + + + public virtual IObservable Amb(IObservable first, IObservable second) + { + return new Amb(first, second); + } + + public virtual IObservable Amb(params IObservable[] sources) + { + return new AmbManyArray(sources); + } + + public virtual IObservable Amb(IEnumerable> sources) + { + return new AmbManyEnumerable(sources); + } + + #endregion + + #region + Buffer + + + public virtual IObservable> Buffer(IObservable source, Func> bufferClosingSelector) + { + return new Buffer.Selector(source, bufferClosingSelector); + } + + public virtual IObservable> Buffer(IObservable source, IObservable bufferOpenings, Func> bufferClosingSelector) + { + return source.Window(bufferOpenings, bufferClosingSelector).SelectMany(ToList); + } + + public virtual IObservable> Buffer(IObservable source, IObservable bufferBoundaries) + { + return new Buffer.Boundaries(source, bufferBoundaries); + } + + #endregion + + #region + Catch + + + public virtual IObservable Catch(IObservable source, Func> handler) where TException : Exception + { + return new Catch(source, handler); + } + + public virtual IObservable Catch(IObservable first, IObservable second) + { + return Catch_(new[] { first, second }); + } + + public virtual IObservable Catch(params IObservable[] sources) + { + return Catch_(sources); + } + + public virtual IObservable Catch(IEnumerable> sources) + { + return Catch_(sources); + } + + private static IObservable Catch_(IEnumerable> sources) + { + return new Catch(sources); + } + + #endregion + + #region + CombineLatest + + + public virtual IObservable CombineLatest(IObservable first, IObservable second, Func resultSelector) + { + return new CombineLatest(first, second, resultSelector); + } + + public virtual IObservable CombineLatest(IEnumerable> sources, Func, TResult> resultSelector) + { + return CombineLatest_(sources, resultSelector); + } + + public virtual IObservable> CombineLatest(IEnumerable> sources) + { + return CombineLatest_(sources, res => res.ToList()); + } + + public virtual IObservable> CombineLatest(params IObservable[] sources) + { + return CombineLatest_(sources, res => res.ToList()); + } + + private static IObservable CombineLatest_(IEnumerable> sources, Func, TResult> resultSelector) + { + return new CombineLatest(sources, resultSelector); + } + + #endregion + + #region + Concat + + + public virtual IObservable Concat(IObservable first, IObservable second) + { + return Concat_(new[] { first, second }); + } + + public virtual IObservable Concat(params IObservable[] sources) + { + return Concat_(sources); + } + + public virtual IObservable Concat(IEnumerable> sources) + { + return Concat_(sources); + } + + private static IObservable Concat_(IEnumerable> sources) + { + return new Concat(sources); + } + + public virtual IObservable Concat(IObservable> sources) + { + return Concat_(sources); + } - internal partial class QueryLanguage + public virtual IObservable Concat(IObservable> sources) { - #region + Amb + + return Concat_(Select(sources, TaskObservableExtensions.ToObservable)); + } - public virtual IObservable Amb(IObservable first, IObservable second) - { - return new Amb(first, second); - } + private static IObservable Concat_(IObservable> sources) + { + return new ConcatMany(sources); + } - public virtual IObservable Amb(params IObservable[] sources) - { - return new AmbManyArray(sources); - } + #endregion - public virtual IObservable Amb(IEnumerable> sources) - { - return new AmbManyEnumerable(sources); - } + #region + Merge + - #endregion + public virtual IObservable Merge(IObservable> sources) + { + return Merge_(sources); + } - #region + Buffer + + public virtual IObservable Merge(IObservable> sources) + { + return new Merge.Tasks(sources); + } + + public virtual IObservable Merge(IObservable> sources, int maxConcurrent) + { + return Merge_(sources, maxConcurrent); + } - public virtual IObservable> Buffer(IObservable source, Func> bufferClosingSelector) - { - return new Buffer.Selector(source, bufferClosingSelector); - } + public virtual IObservable Merge(IEnumerable> sources, int maxConcurrent) + { + return Merge_(sources.ToObservable(SchedulerDefaults.ConstantTimeOperations), maxConcurrent); + } - public virtual IObservable> Buffer(IObservable source, IObservable bufferOpenings, Func> bufferClosingSelector) - { - return source.Window(bufferOpenings, bufferClosingSelector).SelectMany(ToList); - } + public virtual IObservable Merge(IEnumerable> sources, int maxConcurrent, IScheduler scheduler) + { + return Merge_(sources.ToObservable(scheduler), maxConcurrent); + } - public virtual IObservable> Buffer(IObservable source, IObservable bufferBoundaries) - { - return new Buffer.Boundaries(source, bufferBoundaries); - } + public virtual IObservable Merge(IObservable first, IObservable second) + { + return Merge_(new[] { first, second }.ToObservable(SchedulerDefaults.ConstantTimeOperations)); + } - #endregion + public virtual IObservable Merge(IObservable first, IObservable second, IScheduler scheduler) + { + return Merge_(new[] { first, second }.ToObservable(scheduler)); + } - #region + Catch + + public virtual IObservable Merge(params IObservable[] sources) + { + return Merge_(sources.ToObservable(SchedulerDefaults.ConstantTimeOperations)); + } - public virtual IObservable Catch(IObservable source, Func> handler) where TException : Exception - { - return new Catch(source, handler); - } + public virtual IObservable Merge(IScheduler scheduler, params IObservable[] sources) + { + return Merge_(sources.ToObservable(scheduler)); + } - public virtual IObservable Catch(IObservable first, IObservable second) - { - return Catch_(new[] { first, second }); - } + public virtual IObservable Merge(IEnumerable> sources) + { + return Merge_(sources.ToObservable(SchedulerDefaults.ConstantTimeOperations)); + } - public virtual IObservable Catch(params IObservable[] sources) - { - return Catch_(sources); - } + public virtual IObservable Merge(IEnumerable> sources, IScheduler scheduler) + { + return Merge_(sources.ToObservable(scheduler)); + } - public virtual IObservable Catch(IEnumerable> sources) - { - return Catch_(sources); - } - - private static IObservable Catch_(IEnumerable> sources) - { - return new Catch(sources); - } - - #endregion + private static IObservable Merge_(IObservable> sources) + { + return new Merge.Observables(sources); + } - #region + CombineLatest + - - public virtual IObservable CombineLatest(IObservable first, IObservable second, Func resultSelector) - { - return new CombineLatest(first, second, resultSelector); - } - - public virtual IObservable CombineLatest(IEnumerable> sources, Func, TResult> resultSelector) - { - return CombineLatest_(sources, resultSelector); - } - - public virtual IObservable> CombineLatest(IEnumerable> sources) - { - return CombineLatest_(sources, res => res.ToList()); - } - - public virtual IObservable> CombineLatest(params IObservable[] sources) - { - return CombineLatest_(sources, res => res.ToList()); - } - - private static IObservable CombineLatest_(IEnumerable> sources, Func, TResult> resultSelector) - { - return new CombineLatest(sources, resultSelector); - } - - #endregion - - #region + Concat + - - public virtual IObservable Concat(IObservable first, IObservable second) - { - return Concat_(new[] { first, second }); - } - - public virtual IObservable Concat(params IObservable[] sources) - { - return Concat_(sources); - } - - public virtual IObservable Concat(IEnumerable> sources) - { - return Concat_(sources); - } - - private static IObservable Concat_(IEnumerable> sources) - { - return new Concat(sources); - } - - public virtual IObservable Concat(IObservable> sources) - { - return Concat_(sources); - } - - public virtual IObservable Concat(IObservable> sources) - { - return Concat_(Select(sources, TaskObservableExtensions.ToObservable)); - } - - private static IObservable Concat_(IObservable> sources) - { - return new ConcatMany(sources); - } - - #endregion - - #region + Merge + - - public virtual IObservable Merge(IObservable> sources) - { - return Merge_(sources); - } - - public virtual IObservable Merge(IObservable> sources) - { - return new Merge.Tasks(sources); - } - - public virtual IObservable Merge(IObservable> sources, int maxConcurrent) - { - return Merge_(sources, maxConcurrent); - } - - public virtual IObservable Merge(IEnumerable> sources, int maxConcurrent) - { - return Merge_(sources.ToObservable(SchedulerDefaults.ConstantTimeOperations), maxConcurrent); - } - - public virtual IObservable Merge(IEnumerable> sources, int maxConcurrent, IScheduler scheduler) - { - return Merge_(sources.ToObservable(scheduler), maxConcurrent); - } - - public virtual IObservable Merge(IObservable first, IObservable second) - { - return Merge_(new[] { first, second }.ToObservable(SchedulerDefaults.ConstantTimeOperations)); - } - - public virtual IObservable Merge(IObservable first, IObservable second, IScheduler scheduler) - { - return Merge_(new[] { first, second }.ToObservable(scheduler)); - } - - public virtual IObservable Merge(params IObservable[] sources) - { - return Merge_(sources.ToObservable(SchedulerDefaults.ConstantTimeOperations)); - } - - public virtual IObservable Merge(IScheduler scheduler, params IObservable[] sources) - { - return Merge_(sources.ToObservable(scheduler)); - } - - public virtual IObservable Merge(IEnumerable> sources) - { - return Merge_(sources.ToObservable(SchedulerDefaults.ConstantTimeOperations)); - } - - public virtual IObservable Merge(IEnumerable> sources, IScheduler scheduler) - { - return Merge_(sources.ToObservable(scheduler)); - } + private static IObservable Merge_(IObservable> sources, int maxConcurrent) + { + return new Merge.ObservablesMaxConcurrency(sources, maxConcurrent); + } - private static IObservable Merge_(IObservable> sources) - { - return new Merge.Observables(sources); - } - - private static IObservable Merge_(IObservable> sources, int maxConcurrent) - { - return new Merge.ObservablesMaxConcurrency(sources, maxConcurrent); - } + #endregion - #endregion - - #region + OnErrorResumeNext + + #region + OnErrorResumeNext + - public virtual IObservable OnErrorResumeNext(IObservable first, IObservable second) - { - return OnErrorResumeNext_(new[] { first, second }); - } + public virtual IObservable OnErrorResumeNext(IObservable first, IObservable second) + { + return OnErrorResumeNext_(new[] { first, second }); + } - public virtual IObservable OnErrorResumeNext(params IObservable[] sources) - { - return OnErrorResumeNext_(sources); - } + public virtual IObservable OnErrorResumeNext(params IObservable[] sources) + { + return OnErrorResumeNext_(sources); + } - public virtual IObservable OnErrorResumeNext(IEnumerable> sources) - { - return OnErrorResumeNext_(sources); - } + public virtual IObservable OnErrorResumeNext(IEnumerable> sources) + { + return OnErrorResumeNext_(sources); + } - private static IObservable OnErrorResumeNext_(IEnumerable> sources) - { - return new OnErrorResumeNext(sources); - } + private static IObservable OnErrorResumeNext_(IEnumerable> sources) + { + return new OnErrorResumeNext(sources); + } - #endregion + #endregion - #region + SkipUntil + + #region + SkipUntil + - public virtual IObservable SkipUntil(IObservable source, IObservable other) - { - return new SkipUntil(source, other); - } + public virtual IObservable SkipUntil(IObservable source, IObservable other) + { + return new SkipUntil(source, other); + } - #endregion + #endregion - #region + Switch + + #region + Switch + - public virtual IObservable Switch(IObservable> sources) - { - return Switch_(sources); - } + public virtual IObservable Switch(IObservable> sources) + { + return Switch_(sources); + } - public virtual IObservable Switch(IObservable> sources) - { - return Switch_(Select(sources, TaskObservableExtensions.ToObservable)); - } + public virtual IObservable Switch(IObservable> sources) + { + return Switch_(Select(sources, TaskObservableExtensions.ToObservable)); + } - private static IObservable Switch_(IObservable> sources) - { - return new Switch(sources); - } + private static IObservable Switch_(IObservable> sources) + { + return new Switch(sources); + } - #endregion + #endregion - #region + TakeUntil + + #region + TakeUntil + - public virtual IObservable TakeUntil(IObservable source, IObservable other) - { - return new TakeUntil(source, other); - } + public virtual IObservable TakeUntil(IObservable source, IObservable other) + { + return new TakeUntil(source, other); + } - public virtual IObservable TakeUntil(IObservable source, Func stopPredicate) - { - return new TakeUntilPredicate(source, stopPredicate); - } + public virtual IObservable TakeUntil(IObservable source, Func stopPredicate) + { + return new TakeUntilPredicate(source, stopPredicate); + } - #endregion + public virtual IObservable TakeUntil(IObservable source, CancellationToken cancellationToken) + { + return new TakeUntilCancellationToken(source, cancellationToken); + } - #region + Window + + #endregion - public virtual IObservable> Window(IObservable source, Func> windowClosingSelector) - { - return new Window.Selector(source, windowClosingSelector); - } + #region + Window + - public virtual IObservable> Window(IObservable source, IObservable windowOpenings, Func> windowClosingSelector) - { - return windowOpenings.GroupJoin(source, windowClosingSelector, _ => Observable.Empty(), (_, window) => window); - } + public virtual IObservable> Window(IObservable source, Func> windowClosingSelector) + { + return new Window.Selector(source, windowClosingSelector); + } - public virtual IObservable> Window(IObservable source, IObservable windowBoundaries) - { - return new Window.Boundaries(source, windowBoundaries); - } + public virtual IObservable> Window(IObservable source, IObservable windowOpenings, Func> windowClosingSelector) + { + return windowOpenings.GroupJoin(source, windowClosingSelector, _ => Observable.Empty(), (_, window) => window); + } - #endregion + public virtual IObservable> Window(IObservable source, IObservable windowBoundaries) + { + return new Window.Boundaries(source, windowBoundaries); + } - #region + WithLatestFrom + + #endregion - public virtual IObservable WithLatestFrom(IObservable first, IObservable second, Func resultSelector) - { - return new WithLatestFrom(first, second, resultSelector); - } + #region + WithLatestFrom + - #endregion + public virtual IObservable WithLatestFrom(IObservable first, IObservable second, Func resultSelector) + { + return new WithLatestFrom(first, second, resultSelector); + } - #region + Zip + + #endregion - public virtual IObservable Zip(IObservable first, IObservable second, Func resultSelector) - { - return new Zip.Observable(first, second, resultSelector); - } + #region + Zip + - public virtual IObservable Zip(IEnumerable> sources, Func, TResult> resultSelector) - { - return Zip_(sources).Select(resultSelector); - } + public virtual IObservable Zip(IObservable first, IObservable second, Func resultSelector) + { + return new Zip.Observable(first, second, resultSelector); + } - public virtual IObservable> Zip(IEnumerable> sources) - { - return Zip_(sources); - } + public virtual IObservable Zip(IEnumerable> sources, Func, TResult> resultSelector) + { + return Zip_(sources).Select(resultSelector); + } - public virtual IObservable> Zip(params IObservable[] sources) - { - return Zip_(sources); - } + public virtual IObservable> Zip(IEnumerable> sources) + { + return Zip_(sources); + } - private static IObservable> Zip_(IEnumerable> sources) - { - return new Zip(sources); - } + public virtual IObservable> Zip(params IObservable[] sources) + { + return Zip_(sources); + } - public virtual IObservable Zip(IObservable first, IEnumerable second, Func resultSelector) - { - return new Zip.Enumerable(first, second, resultSelector); - } + private static IObservable> Zip_(IEnumerable> sources) + { + return new Zip(sources); + } - #endregion + public virtual IObservable Zip(IObservable first, IEnumerable second, Func resultSelector) + { + return new Zip.Enumerable(first, second, resultSelector); } + + #endregion } diff --git a/Rx.NET/Source/tests/Tests.System.Reactive/Tests/Linq/Observable/TakeUntilTest.cs b/Rx.NET/Source/tests/Tests.System.Reactive/Tests/Linq/Observable/TakeUntilTest.cs index c55ebd2f0..8abcaca5b 100644 --- a/Rx.NET/Source/tests/Tests.System.Reactive/Tests/Linq/Observable/TakeUntilTest.cs +++ b/Rx.NET/Source/tests/Tests.System.Reactive/Tests/Linq/Observable/TakeUntilTest.cs @@ -2,863 +2,924 @@ // The .NET Foundation licenses this file to you under the MIT License. // See the LICENSE file in the project root for more information. + +namespace ReactiveTests.Tests; + using System; using System.Collections.Generic; using System.Linq; using System.Reactive.Concurrency; using System.Reactive.Linq; using System.Threading; + using Microsoft.Reactive.Testing; -using ReactiveTests.Dummies; using Microsoft.VisualStudio.TestTools.UnitTesting; +using ReactiveTests.Dummies; + using Assert = Xunit.Assert; -namespace ReactiveTests.Tests +[TestClass] +public class TakeUntilTest : ReactiveTest { - [TestClass] - public class TakeUntilTest : ReactiveTest - { - #region + Observable + - - [TestMethod] - public void TakeUntil_ArgumentChecking() - { - ReactiveAssert.Throws(() => Observable.TakeUntil(null, DummyObservable.Instance)); - ReactiveAssert.Throws(() => Observable.TakeUntil(DummyObservable.Instance, null)); - } - - [TestMethod] - public void TakeUntil_Preempt_SomeData_Next() - { - var scheduler = new TestScheduler(); - - var l = scheduler.CreateHotObservable( - OnNext(150, 1), - OnNext(210, 2), - OnNext(220, 3), - OnNext(230, 4), - OnNext(240, 5), - OnCompleted(250) - ); - - var r = scheduler.CreateHotObservable( - OnNext(150, 1), - OnNext(225, 99), - OnCompleted(230) - ); - - var res = scheduler.Start(() => - l.TakeUntil(r) - ); + #region + Observable + - res.Messages.AssertEqual( - OnNext(210, 2), - OnNext(220, 3), - OnCompleted(225) - ); - - l.Subscriptions.AssertEqual( - Subscribe(200, 225) - ); - - r.Subscriptions.AssertEqual( - Subscribe(200, 225) - ); - } - - [TestMethod] - public void TakeUntil_Preempt_SomeData_Error() - { - var scheduler = new TestScheduler(); - - var ex = new Exception(); - - var l = scheduler.CreateHotObservable( - OnNext(150, 1), - OnNext(210, 2), - OnNext(220, 3), - OnNext(230, 4), - OnNext(240, 5), - OnCompleted(250) - ); - - var r = scheduler.CreateHotObservable( - OnNext(150, 1), - OnError(225, ex) - ); - - var res = scheduler.Start(() => - l.TakeUntil(r) - ); - - res.Messages.AssertEqual( - OnNext(210, 2), - OnNext(220, 3), - OnError(225, ex) - ); - - l.Subscriptions.AssertEqual( - Subscribe(200, 225) - ); - - r.Subscriptions.AssertEqual( - Subscribe(200, 225) - ); - } - - [TestMethod] - public void TakeUntil_NoPreempt_SomeData_Empty() - { - var scheduler = new TestScheduler(); - - var l = scheduler.CreateHotObservable( - OnNext(150, 1), - OnNext(210, 2), - OnNext(220, 3), - OnNext(230, 4), - OnNext(240, 5), - OnCompleted(250) - ); - - var r = scheduler.CreateHotObservable( - OnNext(150, 1), - OnCompleted(225) - ); - - var res = scheduler.Start(() => - l.TakeUntil(r) - ); - - res.Messages.AssertEqual( - OnNext(210, 2), - OnNext(220, 3), - OnNext(230, 4), - OnNext(240, 5), - OnCompleted(250) - ); - - l.Subscriptions.AssertEqual( - Subscribe(200, 250) - ); + [TestMethod] + public void TakeUntil_ArgumentChecking() + { + ReactiveAssert.Throws(() => Observable.TakeUntil(null, DummyObservable.Instance)); + ReactiveAssert.Throws(() => Observable.TakeUntil(DummyObservable.Instance, null)); + } - r.Subscriptions.AssertEqual( - Subscribe(200, 225) - ); - } + [TestMethod] + public void TakeUntil_Preempt_SomeData_Next() + { + var scheduler = new TestScheduler(); + + var l = scheduler.CreateHotObservable( + OnNext(150, 1), + OnNext(210, 2), + OnNext(220, 3), + OnNext(230, 4), + OnNext(240, 5), + OnCompleted(250) + ); + + var r = scheduler.CreateHotObservable( + OnNext(150, 1), + OnNext(225, 99), + OnCompleted(230) + ); + + var res = scheduler.Start(() => + l.TakeUntil(r) + ); + + res.Messages.AssertEqual( + OnNext(210, 2), + OnNext(220, 3), + OnCompleted(225) + ); + + l.Subscriptions.AssertEqual( + Subscribe(200, 225) + ); + + r.Subscriptions.AssertEqual( + Subscribe(200, 225) + ); + } - [TestMethod] - public void TakeUntil_NoPreempt_SomeData_Never() - { - var scheduler = new TestScheduler(); - - var l = scheduler.CreateHotObservable( - OnNext(150, 1), - OnNext(210, 2), - OnNext(220, 3), - OnNext(230, 4), - OnNext(240, 5), - OnCompleted(250) - ); + [TestMethod] + public void TakeUntil_Preempt_SomeData_Error() + { + var scheduler = new TestScheduler(); + + var ex = new Exception(); + + var l = scheduler.CreateHotObservable( + OnNext(150, 1), + OnNext(210, 2), + OnNext(220, 3), + OnNext(230, 4), + OnNext(240, 5), + OnCompleted(250) + ); + + var r = scheduler.CreateHotObservable( + OnNext(150, 1), + OnError(225, ex) + ); + + var res = scheduler.Start(() => + l.TakeUntil(r) + ); + + res.Messages.AssertEqual( + OnNext(210, 2), + OnNext(220, 3), + OnError(225, ex) + ); + + l.Subscriptions.AssertEqual( + Subscribe(200, 225) + ); + + r.Subscriptions.AssertEqual( + Subscribe(200, 225) + ); + } - var r = scheduler.CreateHotObservable( - OnNext(150, 1) - ); + [TestMethod] + public void TakeUntil_NoPreempt_SomeData_Empty() + { + var scheduler = new TestScheduler(); + + var l = scheduler.CreateHotObservable( + OnNext(150, 1), + OnNext(210, 2), + OnNext(220, 3), + OnNext(230, 4), + OnNext(240, 5), + OnCompleted(250) + ); + + var r = scheduler.CreateHotObservable( + OnNext(150, 1), + OnCompleted(225) + ); + + var res = scheduler.Start(() => + l.TakeUntil(r) + ); + + res.Messages.AssertEqual( + OnNext(210, 2), + OnNext(220, 3), + OnNext(230, 4), + OnNext(240, 5), + OnCompleted(250) + ); + + l.Subscriptions.AssertEqual( + Subscribe(200, 250) + ); + + r.Subscriptions.AssertEqual( + Subscribe(200, 225) + ); + } - var res = scheduler.Start(() => - l.TakeUntil(r) - ); + [TestMethod] + public void TakeUntil_NoPreempt_SomeData_Never() + { + var scheduler = new TestScheduler(); + + var l = scheduler.CreateHotObservable( + OnNext(150, 1), + OnNext(210, 2), + OnNext(220, 3), + OnNext(230, 4), + OnNext(240, 5), + OnCompleted(250) + ); + + var r = scheduler.CreateHotObservable( + OnNext(150, 1) + ); + + var res = scheduler.Start(() => + l.TakeUntil(r) + ); + + res.Messages.AssertEqual( + OnNext(210, 2), + OnNext(220, 3), + OnNext(230, 4), + OnNext(240, 5), + OnCompleted(250) + ); + + l.Subscriptions.AssertEqual( + Subscribe(200, 250) + ); + + r.Subscriptions.AssertEqual( + Subscribe(200, 250) + ); + } - res.Messages.AssertEqual( - OnNext(210, 2), - OnNext(220, 3), - OnNext(230, 4), - OnNext(240, 5), - OnCompleted(250) - ); + [TestMethod] + public void TakeUntil_Preempt_Never_Next() + { + var scheduler = new TestScheduler(); - l.Subscriptions.AssertEqual( - Subscribe(200, 250) - ); + var l = scheduler.CreateHotObservable( + OnNext(150, 1) + ); - r.Subscriptions.AssertEqual( - Subscribe(200, 250) - ); - } + var r = scheduler.CreateHotObservable( + OnNext(150, 1), + OnNext(225, 2), //! + OnCompleted(250) + ); - [TestMethod] - public void TakeUntil_Preempt_Never_Next() - { - var scheduler = new TestScheduler(); + var res = scheduler.Start(() => + l.TakeUntil(r) + ); - var l = scheduler.CreateHotObservable( - OnNext(150, 1) - ); + res.Messages.AssertEqual( + OnCompleted(225) + ); - var r = scheduler.CreateHotObservable( - OnNext(150, 1), - OnNext(225, 2), //! - OnCompleted(250) - ); + l.Subscriptions.AssertEqual( + Subscribe(200, 225) + ); - var res = scheduler.Start(() => - l.TakeUntil(r) - ); + r.Subscriptions.AssertEqual( + Subscribe(200, 225) + ); + } - res.Messages.AssertEqual( - OnCompleted(225) - ); + [TestMethod] + public void TakeUntil_Preempt_Never_Error() + { + var scheduler = new TestScheduler(); - l.Subscriptions.AssertEqual( - Subscribe(200, 225) - ); + var ex = new Exception(); - r.Subscriptions.AssertEqual( - Subscribe(200, 225) - ); - } + var l = scheduler.CreateHotObservable( + OnNext(150, 1) + ); - [TestMethod] - public void TakeUntil_Preempt_Never_Error() - { - var scheduler = new TestScheduler(); + var r = scheduler.CreateHotObservable( + OnNext(150, 1), + OnError(225, ex) + ); - var ex = new Exception(); + var res = scheduler.Start(() => + l.TakeUntil(r) + ); - var l = scheduler.CreateHotObservable( - OnNext(150, 1) - ); + res.Messages.AssertEqual( + OnError(225, ex) + ); - var r = scheduler.CreateHotObservable( - OnNext(150, 1), - OnError(225, ex) - ); + l.Subscriptions.AssertEqual( + Subscribe(200, 225) + ); - var res = scheduler.Start(() => - l.TakeUntil(r) - ); + r.Subscriptions.AssertEqual( + Subscribe(200, 225) + ); + } - res.Messages.AssertEqual( - OnError(225, ex) - ); + [TestMethod] + public void TakeUntil_NoPreempt_Never_Empty() + { + var scheduler = new TestScheduler(); - l.Subscriptions.AssertEqual( - Subscribe(200, 225) - ); + var l = scheduler.CreateHotObservable( + OnNext(150, 1) + ); - r.Subscriptions.AssertEqual( - Subscribe(200, 225) - ); - } + var r = scheduler.CreateHotObservable( + OnNext(150, 1), + OnCompleted(225) + ); - [TestMethod] - public void TakeUntil_NoPreempt_Never_Empty() - { - var scheduler = new TestScheduler(); + var res = scheduler.Start(() => + l.TakeUntil(r) + ); - var l = scheduler.CreateHotObservable( - OnNext(150, 1) - ); + res.Messages.AssertEqual( + ); - var r = scheduler.CreateHotObservable( - OnNext(150, 1), - OnCompleted(225) - ); + l.Subscriptions.AssertEqual( + Subscribe(200, 1000 /* can't dispose prematurely, could be in flight to dispatch OnError */) + ); - var res = scheduler.Start(() => - l.TakeUntil(r) - ); + r.Subscriptions.AssertEqual( + Subscribe(200, 225) + ); + } - res.Messages.AssertEqual( - ); + [TestMethod] + public void TakeUntil_NoPreempt_Never_Never() + { + var scheduler = new TestScheduler(); - l.Subscriptions.AssertEqual( - Subscribe(200, 1000 /* can't dispose prematurely, could be in flight to dispatch OnError */) - ); + var l = scheduler.CreateHotObservable( + OnNext(150, 1) + ); - r.Subscriptions.AssertEqual( - Subscribe(200, 225) - ); - } + var r = scheduler.CreateHotObservable( + OnNext(150, 1) + ); - [TestMethod] - public void TakeUntil_NoPreempt_Never_Never() - { - var scheduler = new TestScheduler(); + var res = scheduler.Start(() => + l.TakeUntil(r) + ); - var l = scheduler.CreateHotObservable( - OnNext(150, 1) - ); + res.Messages.AssertEqual( + ); - var r = scheduler.CreateHotObservable( - OnNext(150, 1) - ); + l.Subscriptions.AssertEqual( + Subscribe(200, 1000) + ); - var res = scheduler.Start(() => - l.TakeUntil(r) - ); + r.Subscriptions.AssertEqual( + Subscribe(200, 1000) + ); + } - res.Messages.AssertEqual( - ); + [TestMethod] + public void TakeUntil_Preempt_BeforeFirstProduced() + { + var scheduler = new TestScheduler(); + + var l = scheduler.CreateHotObservable( + OnNext(150, 1), + OnNext(230, 2), + OnCompleted(240) + ); + + var r = scheduler.CreateHotObservable( + OnNext(150, 1), + OnNext(210, 2), //! + OnCompleted(220) + ); + + var res = scheduler.Start(() => + l.TakeUntil(r) + ); + + res.Messages.AssertEqual( + OnCompleted(210) + ); + + l.Subscriptions.AssertEqual( + Subscribe(200, 210) + ); + + r.Subscriptions.AssertEqual( + Subscribe(200, 210) + ); + } - l.Subscriptions.AssertEqual( - Subscribe(200, 1000) - ); + [TestMethod] + public void TakeUntil_Preempt_BeforeFirstProduced_RemainSilentAndProperDisposed() + { + var scheduler = new TestScheduler(); - r.Subscriptions.AssertEqual( - Subscribe(200, 1000) - ); - } + var sourceNotDisposed = false; - [TestMethod] - public void TakeUntil_Preempt_BeforeFirstProduced() - { - var scheduler = new TestScheduler(); + var l = scheduler.CreateHotObservable( + OnNext(150, 1), + OnError(215, new Exception()), // should not come + OnCompleted(240) + ); - var l = scheduler.CreateHotObservable( - OnNext(150, 1), - OnNext(230, 2), - OnCompleted(240) - ); + var r = scheduler.CreateHotObservable( + OnNext(150, 1), + OnNext(210, 2), //! + OnCompleted(220) + ); - var r = scheduler.CreateHotObservable( - OnNext(150, 1), - OnNext(210, 2), //! - OnCompleted(220) - ); + var res = scheduler.Start(() => + l.Do(_ => sourceNotDisposed = true).TakeUntil(r) + ); - var res = scheduler.Start(() => - l.TakeUntil(r) - ); + res.Messages.AssertEqual( + OnCompleted(210) + ); - res.Messages.AssertEqual( - OnCompleted(210) - ); + Assert.False(sourceNotDisposed); + } - l.Subscriptions.AssertEqual( - Subscribe(200, 210) - ); + [TestMethod] + public void TakeUntil_NoPreempt_AfterLastProduced_ProperDisposedSignal() + { + var scheduler = new TestScheduler(); - r.Subscriptions.AssertEqual( - Subscribe(200, 210) - ); - } + var signalNotDisposed = false; - [TestMethod] - public void TakeUntil_Preempt_BeforeFirstProduced_RemainSilentAndProperDisposed() - { - var scheduler = new TestScheduler(); + var l = scheduler.CreateHotObservable( + OnNext(150, 1), + OnNext(230, 2), + OnCompleted(240) + ); - var sourceNotDisposed = false; + var r = scheduler.CreateHotObservable( + OnNext(150, 1), + OnNext(250, 2), + OnCompleted(260) + ); - var l = scheduler.CreateHotObservable( - OnNext(150, 1), - OnError(215, new Exception()), // should not come - OnCompleted(240) - ); + var res = scheduler.Start(() => + l.TakeUntil(r.Do(_ => signalNotDisposed = true)) + ); - var r = scheduler.CreateHotObservable( - OnNext(150, 1), - OnNext(210, 2), //! - OnCompleted(220) - ); + res.Messages.AssertEqual( + OnNext(230, 2), + OnCompleted(240) + ); - var res = scheduler.Start(() => - l.Do(_ => sourceNotDisposed = true).TakeUntil(r) - ); + Assert.False(signalNotDisposed); + } - res.Messages.AssertEqual( - OnCompleted(210) - ); + [TestMethod] + public void TakeUntil_Error_Some() + { + var scheduler = new TestScheduler(); - Assert.False(sourceNotDisposed); - } + var ex = new Exception(); - [TestMethod] - public void TakeUntil_NoPreempt_AfterLastProduced_ProperDisposedSignal() - { - var scheduler = new TestScheduler(); + var l = scheduler.CreateHotObservable( + OnNext(150, 1), + OnError(225, ex) + ); - var signalNotDisposed = false; + var r = scheduler.CreateHotObservable( + OnNext(150, 1), + OnNext(240, 2) + ); - var l = scheduler.CreateHotObservable( - OnNext(150, 1), - OnNext(230, 2), - OnCompleted(240) - ); + var res = scheduler.Start(() => + l.TakeUntil(r) + ); - var r = scheduler.CreateHotObservable( - OnNext(150, 1), - OnNext(250, 2), - OnCompleted(260) - ); + res.Messages.AssertEqual( + OnError(225, ex) + ); - var res = scheduler.Start(() => - l.TakeUntil(r.Do(_ => signalNotDisposed = true)) - ); + l.Subscriptions.AssertEqual( + Subscribe(200, 225) + ); - res.Messages.AssertEqual( - OnNext(230, 2), - OnCompleted(240) - ); - - Assert.False(signalNotDisposed); - } - - [TestMethod] - public void TakeUntil_Error_Some() - { - var scheduler = new TestScheduler(); - - var ex = new Exception(); + r.Subscriptions.AssertEqual( + Subscribe(200, 225) + ); + } - var l = scheduler.CreateHotObservable( - OnNext(150, 1), - OnError(225, ex) - ); + [TestMethod] + public void TakeUntil_Immediate() + { + var scheduler = new TestScheduler(); - var r = scheduler.CreateHotObservable( - OnNext(150, 1), - OnNext(240, 2) - ); + var xs = Observable.Return(1); + var ys = Observable.Return("bar"); - var res = scheduler.Start(() => - l.TakeUntil(r) - ); + var res = scheduler.Start(() => + xs.TakeUntil(ys) + ); - res.Messages.AssertEqual( - OnError(225, ex) - ); + res.Messages.AssertEqual( + OnCompleted(200) + ); + } + #endregion - l.Subscriptions.AssertEqual( - Subscribe(200, 225) - ); + #region + Timed + - r.Subscriptions.AssertEqual( - Subscribe(200, 225) - ); - } + [TestMethod] + public void TakeUntil_Timed_ArgumentChecking() + { + var xs = Observable.Return(42); - [TestMethod] - public void TakeUntil_Immediate() - { - var scheduler = new TestScheduler(); + ReactiveAssert.Throws(() => Observable.TakeUntil(default(IObservable), DateTimeOffset.Now)); - var xs = Observable.Return(1); - var ys = Observable.Return("bar"); + ReactiveAssert.Throws(() => Observable.TakeUntil(default(IObservable), DateTimeOffset.Now, Scheduler.Default)); + ReactiveAssert.Throws(() => Observable.TakeUntil(xs, DateTimeOffset.Now, default)); + } - var res = scheduler.Start(() => - xs.TakeUntil(ys) - ); + [TestMethod] + public void TakeUntil_Zero() + { + var scheduler = new TestScheduler(); - res.Messages.AssertEqual( - OnCompleted(200) - ); - } - #endregion + var xs = scheduler.CreateHotObservable( + OnNext(210, 1), + OnNext(220, 2), + OnCompleted(230) + ); - #region + Timed + + var res = scheduler.Start(() => + xs.TakeUntil(new DateTimeOffset(), scheduler) + ); - [TestMethod] - public void TakeUntil_Timed_ArgumentChecking() - { - var xs = Observable.Return(42); + res.Messages.AssertEqual( + OnCompleted(201) + ); - ReactiveAssert.Throws(() => Observable.TakeUntil(default(IObservable), DateTimeOffset.Now)); + xs.Subscriptions.AssertEqual( + Subscribe(200, 201) + ); + } - ReactiveAssert.Throws(() => Observable.TakeUntil(default(IObservable), DateTimeOffset.Now, Scheduler.Default)); - ReactiveAssert.Throws(() => Observable.TakeUntil(xs, DateTimeOffset.Now, default)); - } + [TestMethod] + public void TakeUntil_Some() + { + var scheduler = new TestScheduler(); + + var xs = scheduler.CreateHotObservable( + OnNext(210, 1), + OnNext(220, 2), + OnNext(230, 3), + OnCompleted(240) + ); + + var res = scheduler.Start(() => + xs.TakeUntil(new DateTimeOffset(225, TimeSpan.Zero), scheduler) + ); + + res.Messages.AssertEqual( + OnNext(210, 1), + OnNext(220, 2), + OnCompleted(225) + ); + + xs.Subscriptions.AssertEqual( + Subscribe(200, 225) + ); + } - [TestMethod] - public void TakeUntil_Zero() - { - var scheduler = new TestScheduler(); + [TestMethod] + public void TakeUntil_Late() + { + var scheduler = new TestScheduler(); + + var xs = scheduler.CreateHotObservable( + OnNext(210, 1), + OnNext(220, 2), + OnCompleted(230) + ); + + var res = scheduler.Start(() => + xs.TakeUntil(new DateTimeOffset(250, TimeSpan.Zero), scheduler) + ); + + res.Messages.AssertEqual( + OnNext(210, 1), + OnNext(220, 2), + OnCompleted(230) + ); + + xs.Subscriptions.AssertEqual( + Subscribe(200, 230) + ); + } - var xs = scheduler.CreateHotObservable( - OnNext(210, 1), - OnNext(220, 2), - OnCompleted(230) - ); + [TestMethod] + public void TakeUntil_Error() + { + var scheduler = new TestScheduler(); - var res = scheduler.Start(() => - xs.TakeUntil(new DateTimeOffset(), scheduler) - ); + var ex = new Exception(); - res.Messages.AssertEqual( - OnCompleted(201) - ); + var xs = scheduler.CreateHotObservable( + OnError(210, ex) + ); - xs.Subscriptions.AssertEqual( - Subscribe(200, 201) - ); - } + var res = scheduler.Start(() => + xs.TakeUntil(new DateTimeOffset(250, TimeSpan.Zero), scheduler) + ); - [TestMethod] - public void TakeUntil_Some() - { - var scheduler = new TestScheduler(); + res.Messages.AssertEqual( + OnError(210, ex) + ); - var xs = scheduler.CreateHotObservable( - OnNext(210, 1), - OnNext(220, 2), - OnNext(230, 3), - OnCompleted(240) - ); + xs.Subscriptions.AssertEqual( + Subscribe(200, 210) + ); + } - var res = scheduler.Start(() => - xs.TakeUntil(new DateTimeOffset(225, TimeSpan.Zero), scheduler) - ); + [TestMethod] + public void TakeUntil_Never() + { + var scheduler = new TestScheduler(); - res.Messages.AssertEqual( - OnNext(210, 1), - OnNext(220, 2), - OnCompleted(225) - ); + var ex = new Exception(); - xs.Subscriptions.AssertEqual( - Subscribe(200, 225) - ); - } + var xs = scheduler.CreateHotObservable( + ); - [TestMethod] - public void TakeUntil_Late() - { - var scheduler = new TestScheduler(); + var res = scheduler.Start(() => + xs.TakeUntil(new DateTimeOffset(250, TimeSpan.Zero), scheduler) + ); - var xs = scheduler.CreateHotObservable( - OnNext(210, 1), - OnNext(220, 2), - OnCompleted(230) - ); + res.Messages.AssertEqual( + OnCompleted(250) + ); - var res = scheduler.Start(() => - xs.TakeUntil(new DateTimeOffset(250, TimeSpan.Zero), scheduler) - ); + xs.Subscriptions.AssertEqual( + Subscribe(200, 250) + ); + } - res.Messages.AssertEqual( - OnNext(210, 1), - OnNext(220, 2), - OnCompleted(230) - ); + [TestMethod] + public void TakeUntil_Twice1() + { + var scheduler = new TestScheduler(); + + var ex = new Exception(); + + var xs = scheduler.CreateHotObservable( + OnNext(210, 1), + OnNext(220, 2), + OnNext(230, 3), + OnNext(240, 4), + OnNext(250, 5), + OnNext(260, 6), + OnCompleted(270) + ); + + var res = scheduler.Start(() => + xs.TakeUntil(new DateTimeOffset(255, TimeSpan.Zero), scheduler).TakeUntil(new DateTimeOffset(235, TimeSpan.Zero), scheduler) + ); + + res.Messages.AssertEqual( + OnNext(210, 1), + OnNext(220, 2), + OnNext(230, 3), + OnCompleted(235) + ); + + xs.Subscriptions.AssertEqual( + Subscribe(200, 235) + ); + } - xs.Subscriptions.AssertEqual( - Subscribe(200, 230) - ); - } + [TestMethod] + public void TakeUntil_Twice2() + { + var scheduler = new TestScheduler(); + + var ex = new Exception(); + + var xs = scheduler.CreateHotObservable( + OnNext(210, 1), + OnNext(220, 2), + OnNext(230, 3), + OnNext(240, 4), + OnNext(250, 5), + OnNext(260, 6), + OnCompleted(270) + ); + + var res = scheduler.Start(() => + xs.TakeUntil(new DateTimeOffset(235, TimeSpan.Zero), scheduler).TakeUntil(new DateTimeOffset(255, TimeSpan.Zero), scheduler) + ); + + res.Messages.AssertEqual( + OnNext(210, 1), + OnNext(220, 2), + OnNext(230, 3), + OnCompleted(235) + ); + + xs.Subscriptions.AssertEqual( + Subscribe(200, 235) + ); + } - [TestMethod] - public void TakeUntil_Error() - { - var scheduler = new TestScheduler(); + [TestMethod] + public void TakeUntil_Default() + { + var xs = Observable.Range(0, 10, Scheduler.Default); - var ex = new Exception(); + var res = xs.TakeUntil(DateTimeOffset.Now.AddMinutes(1)); - var xs = scheduler.CreateHotObservable( - OnError(210, ex) - ); + var e = new ManualResetEvent(false); - var res = scheduler.Start(() => - xs.TakeUntil(new DateTimeOffset(250, TimeSpan.Zero), scheduler) - ); + var lst = new List(); + res.Subscribe( + lst.Add, + () => e.Set() + ); - res.Messages.AssertEqual( - OnError(210, ex) - ); + e.WaitOne(); - xs.Subscriptions.AssertEqual( - Subscribe(200, 210) - ); - } + Assert.True(lst.SequenceEqual(Enumerable.Range(0, 10))); + } - [TestMethod] - public void TakeUntil_Never() - { - var scheduler = new TestScheduler(); + #endregion - var ex = new Exception(); + #region + Predicate + - var xs = scheduler.CreateHotObservable( - ); + [TestMethod] + public void TakeUntil_Predicate_ArgumentChecking() + { + ReactiveAssert.Throws(() => Observable.TakeUntil(null, v => true)); + ReactiveAssert.Throws(() => Observable.TakeUntil(DummyObservable.Instance, null)); + } - var res = scheduler.Start(() => - xs.TakeUntil(new DateTimeOffset(250, TimeSpan.Zero), scheduler) - ); + [TestMethod] + public void TakeUntil_Predicate_Basic() + { + var scheduler = new TestScheduler(); + + var source = scheduler.CreateColdObservable( + OnNext(10, 1), + OnNext(20, 2), + OnNext(30, 3), + OnNext(40, 4), + OnNext(50, 5), + OnNext(60, 6), + OnNext(70, 7), + OnNext(80, 8), + OnNext(90, 9), + OnCompleted(100) + ); + + var result = scheduler.Start(() => source.TakeUntil(v => v == 5)); + + result.Messages.AssertEqual( + OnNext(210, 1), + OnNext(220, 2), + OnNext(230, 3), + OnNext(240, 4), + OnNext(250, 5), + OnCompleted(250) + ); + + source.Subscriptions.AssertEqual( + Subscribe(200, 250) + ); + } - res.Messages.AssertEqual( - OnCompleted(250) - ); + [TestMethod] + public void TakeUntil_Predicate_True() + { + var scheduler = new TestScheduler(); + + var source = scheduler.CreateColdObservable( + OnNext(10, 1), + OnNext(20, 2), + OnNext(30, 3), + OnNext(40, 4), + OnNext(50, 5), + OnNext(60, 6), + OnNext(70, 7), + OnNext(80, 8), + OnNext(90, 9), + OnCompleted(100) + ); + + var result = scheduler.Start(() => source.TakeUntil(v => true)); + + result.Messages.AssertEqual( + OnNext(210, 1), + OnCompleted(210) + ); + + source.Subscriptions.AssertEqual( + Subscribe(200, 210) + ); + } - xs.Subscriptions.AssertEqual( - Subscribe(200, 250) - ); - } + [TestMethod] + public void TakeUntil_Predicate_False() + { + var scheduler = new TestScheduler(); + + var source = scheduler.CreateColdObservable( + OnNext(10, 1), + OnNext(20, 2), + OnNext(30, 3), + OnNext(40, 4), + OnNext(50, 5), + OnNext(60, 6), + OnNext(70, 7), + OnNext(80, 8), + OnNext(90, 9), + OnCompleted(100) + ); + + var result = scheduler.Start(() => source.TakeUntil(v => false)); + + result.Messages.AssertEqual( + OnNext(210, 1), + OnNext(220, 2), + OnNext(230, 3), + OnNext(240, 4), + OnNext(250, 5), + OnNext(260, 6), + OnNext(270, 7), + OnNext(280, 8), + OnNext(290, 9), + OnCompleted(300) + ); + + source.Subscriptions.AssertEqual( + Subscribe(200, 300) + ); + } - [TestMethod] - public void TakeUntil_Twice1() - { - var scheduler = new TestScheduler(); + [TestMethod] + public void TakeUntil_Predicate_Error() + { + var scheduler = new TestScheduler(); - var ex = new Exception(); + var ex = new InvalidOperationException(); - var xs = scheduler.CreateHotObservable( - OnNext(210, 1), - OnNext(220, 2), - OnNext(230, 3), - OnNext(240, 4), - OnNext(250, 5), - OnNext(260, 6), - OnCompleted(270) + var source = scheduler.CreateColdObservable( + OnNext(10, 1), + OnNext(20, 2), + OnNext(30, 3), + OnError(40, ex) ); - var res = scheduler.Start(() => - xs.TakeUntil(new DateTimeOffset(255, TimeSpan.Zero), scheduler).TakeUntil(new DateTimeOffset(235, TimeSpan.Zero), scheduler) - ); + var result = scheduler.Start(() => source.TakeUntil(v => false)); - res.Messages.AssertEqual( - OnNext(210, 1), - OnNext(220, 2), - OnNext(230, 3), - OnCompleted(235) - ); + result.Messages.AssertEqual( + OnNext(210, 1), + OnNext(220, 2), + OnNext(230, 3), + OnError(240, ex) + ); - xs.Subscriptions.AssertEqual( - Subscribe(200, 235) - ); - } + source.Subscriptions.AssertEqual( + Subscribe(200, 240) + ); + } - [TestMethod] - public void TakeUntil_Twice2() - { - var scheduler = new TestScheduler(); + [TestMethod] + public void TakeUntil_Predicate_Crash() + { + var scheduler = new TestScheduler(); - var ex = new Exception(); + var ex = new InvalidOperationException(); - var xs = scheduler.CreateHotObservable( - OnNext(210, 1), - OnNext(220, 2), - OnNext(230, 3), + var source = scheduler.CreateColdObservable( + OnNext(10, 1), + OnNext(20, 2), + OnNext(30, 3), OnNext(240, 4), OnNext(250, 5), - OnNext(260, 6), - OnCompleted(270) - ); - - var res = scheduler.Start(() => - xs.TakeUntil(new DateTimeOffset(235, TimeSpan.Zero), scheduler).TakeUntil(new DateTimeOffset(255, TimeSpan.Zero), scheduler) - ); - - res.Messages.AssertEqual( - OnNext(210, 1), - OnNext(220, 2), - OnNext(230, 3), - OnCompleted(235) - ); - - xs.Subscriptions.AssertEqual( - Subscribe(200, 235) - ); - } - - [TestMethod] - public void TakeUntil_Default() - { - var xs = Observable.Range(0, 10, Scheduler.Default); - - var res = xs.TakeUntil(DateTimeOffset.Now.AddMinutes(1)); - - var e = new ManualResetEvent(false); - - var lst = new List(); - res.Subscribe( - lst.Add, - () => e.Set() + OnCompleted(260) ); - e.WaitOne(); - - Assert.True(lst.SequenceEqual(Enumerable.Range(0, 10))); - } - - #endregion - - #region + Predicate + - - [TestMethod] - public void TakeUntil_Predicate_ArgumentChecking() - { - ReactiveAssert.Throws(() => Observable.TakeUntil(null, v => true)); - ReactiveAssert.Throws(() => Observable.TakeUntil(DummyObservable.Instance, null)); - } - - [TestMethod] - public void TakeUntil_Predicate_Basic() + var result = scheduler.Start(() => source.TakeUntil(v => { - var scheduler = new TestScheduler(); - - var source = scheduler.CreateColdObservable( - OnNext(10, 1), - OnNext(20, 2), - OnNext(30, 3), - OnNext(40, 4), - OnNext(50, 5), - OnNext(60, 6), - OnNext(70, 7), - OnNext(80, 8), - OnNext(90, 9), - OnCompleted(100) - ); - - var result = scheduler.Start(() => source.TakeUntil(v => v == 5)); - - result.Messages.AssertEqual( - OnNext(210, 1), - OnNext(220, 2), - OnNext(230, 3), - OnNext(240, 4), - OnNext(250, 5), - OnCompleted(250) - ); - - source.Subscriptions.AssertEqual( - Subscribe(200, 250) - ); - } + if (v == 3) + { + throw ex; + } + return false; + })); + + result.Messages.AssertEqual( + OnNext(210, 1), + OnNext(220, 2), + OnNext(230, 3), + OnError(230, ex) + ); + + source.Subscriptions.AssertEqual( + Subscribe(200, 230) + ); + } - [TestMethod] - public void TakeUntil_Predicate_True() - { - var scheduler = new TestScheduler(); - - var source = scheduler.CreateColdObservable( - OnNext(10, 1), - OnNext(20, 2), - OnNext(30, 3), - OnNext(40, 4), - OnNext(50, 5), - OnNext(60, 6), - OnNext(70, 7), - OnNext(80, 8), - OnNext(90, 9), - OnCompleted(100) - ); - - var result = scheduler.Start(() => source.TakeUntil(v => true)); - - result.Messages.AssertEqual( - OnNext(210, 1), - OnCompleted(210) - ); + #endregion - source.Subscriptions.AssertEqual( - Subscribe(200, 210) - ); - } + #region + CancellationToken + - [TestMethod] - public void TakeUntil_Predicate_False() - { - var scheduler = new TestScheduler(); - - var source = scheduler.CreateColdObservable( - OnNext(10, 1), - OnNext(20, 2), - OnNext(30, 3), - OnNext(40, 4), - OnNext(50, 5), - OnNext(60, 6), - OnNext(70, 7), - OnNext(80, 8), - OnNext(90, 9), - OnCompleted(100) - ); - - var result = scheduler.Start(() => source.TakeUntil(v => false)); - - result.Messages.AssertEqual( - OnNext(210, 1), - OnNext(220, 2), - OnNext(230, 3), - OnNext(240, 4), - OnNext(250, 5), - OnNext(260, 6), - OnNext(270, 7), - OnNext(280, 8), - OnNext(290, 9), - OnCompleted(300) - ); + [TestMethod] + public void TakeUntil_CancellationToken_BasicCancelation() + { + var scheduler = new TestScheduler(); + var tokenSource = new CancellationTokenSource(); - source.Subscriptions.AssertEqual( - Subscribe(200, 300) + var source = scheduler.CreateColdObservable( + OnNext(10, 1), + OnNext(20, 2), + OnNext(30, 3), + OnNext(40, 4), + OnNext(50, 5), + OnCompleted(260) ); - } - - [TestMethod] - public void TakeUntil_Predicate_Error() - { - var scheduler = new TestScheduler(); - var ex = new InvalidOperationException(); + scheduler.ScheduleAbsolute(235, () => tokenSource.Cancel()); - var source = scheduler.CreateColdObservable( - OnNext(10, 1), - OnNext(20, 2), - OnNext(30, 3), - OnError(40, ex) - ); + var result = scheduler.Start(() => source.TakeUntil(tokenSource.Token)); - var result = scheduler.Start(() => source.TakeUntil(v => false)); - - result.Messages.AssertEqual( - OnNext(210, 1), - OnNext(220, 2), - OnNext(230, 3), - OnError(240, ex) - ); - - source.Subscriptions.AssertEqual( - Subscribe(200, 240) - ); - } + result.Messages.AssertEqual( + OnNext(210, 1), + OnNext(220, 2), + OnNext(230, 3), + OnCompleted(235) + ); - [TestMethod] - public void TakeUntil_Predicate_Crash() - { - var scheduler = new TestScheduler(); - - var ex = new InvalidOperationException(); + source.Subscriptions.AssertEqual( + Subscribe(200, 235) + ); + } - var source = scheduler.CreateColdObservable( - OnNext(10, 1), - OnNext(20, 2), - OnNext(30, 3), - OnNext(240, 4), - OnNext(250, 5), - OnCompleted(260) - ); + [TestMethod] + public void TakeUntil_CancellationToken_AlreadyCanceled() + { + var scheduler = new TestScheduler(); + var tokenSource = new CancellationTokenSource(); + tokenSource.Cancel(); - var result = scheduler.Start(() => source.TakeUntil(v => - { - if (v == 3) - { - throw ex; - } - return false; - })); - - result.Messages.AssertEqual( - OnNext(210, 1), - OnNext(220, 2), - OnNext(230, 3), - OnError(230, ex) + var source = scheduler.CreateColdObservable( + OnNext(10, 1), + OnNext(20, 2), + OnNext(30, 3), + OnNext(40, 4), + OnNext(50, 5), + OnCompleted(260) ); - source.Subscriptions.AssertEqual( - Subscribe(200, 230) - ); - } + var result = scheduler.Start(() => source.TakeUntil(tokenSource.Token)); - #endregion + result.Messages.AssertEqual( + OnCompleted(200) + ); + Assert.Empty(source.Subscriptions); } + + #endregion }