// 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. using System.Collections.Generic; using System.Linq; using System.Reactive.Concurrency; using System.Reactive.Threading.Tasks; using System.Threading.Tasks; namespace System.Reactive.Linq { using ObservableImpl; internal partial class QueryLanguage { #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); } 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) { return new Merge.Observables(sources); } private static IObservable Merge_(IObservable> sources, int maxConcurrent) { return new Merge.ObservablesMaxConcurrency(sources, maxConcurrent); } #endregion #region + OnErrorResumeNext + 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(IEnumerable> sources) { return OnErrorResumeNext_(sources); } private static IObservable OnErrorResumeNext_(IEnumerable> sources) { return new OnErrorResumeNext(sources); } #endregion #region + SkipUntil + public virtual IObservable SkipUntil(IObservable source, IObservable other) { return new SkipUntil(source, other); } #endregion #region + Switch + public virtual IObservable Switch(IObservable> sources) { return Switch_(sources); } public virtual IObservable Switch(IObservable> sources) { return Switch_(Select(sources, TaskObservableExtensions.ToObservable)); } private static IObservable Switch_(IObservable> sources) { return new Switch(sources); } #endregion #region + TakeUntil + 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); } #endregion #region + Window + public virtual IObservable> Window(IObservable source, Func> windowClosingSelector) { return new Window.Selector(source, windowClosingSelector); } 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, IObservable windowBoundaries) { return new Window.Boundaries(source, windowBoundaries); } #endregion #region + WithLatestFrom + public virtual IObservable WithLatestFrom(IObservable first, IObservable second, Func resultSelector) { return new WithLatestFrom(first, second, resultSelector); } #endregion #region + Zip + public virtual IObservable Zip(IObservable first, IObservable second, Func resultSelector) { return new Zip.Observable(first, second, resultSelector); } public virtual IObservable Zip(IEnumerable> sources, Func, TResult> resultSelector) { return Zip_(sources).Select(resultSelector); } public virtual IObservable> Zip(IEnumerable> sources) { return Zip_(sources); } public virtual IObservable> Zip(params IObservable[] sources) { return Zip_(sources); } private static IObservable> Zip_(IEnumerable> sources) { return new Zip(sources); } public virtual IObservable Zip(IObservable first, IEnumerable second, Func resultSelector) { return new Zip.Enumerable(first, second, resultSelector); } #endregion } }