350 lines
13 KiB
C#
350 lines
13 KiB
C#
// 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<TSource> Amb<TSource>(IObservable<TSource> first, IObservable<TSource> second)
|
|
{
|
|
return new Amb<TSource>(first, second);
|
|
}
|
|
|
|
public virtual IObservable<TSource> Amb<TSource>(params IObservable<TSource>[] sources)
|
|
{
|
|
return new AmbManyArray<TSource>(sources);
|
|
}
|
|
|
|
public virtual IObservable<TSource> Amb<TSource>(IEnumerable<IObservable<TSource>> sources)
|
|
{
|
|
return new AmbManyEnumerable<TSource>(sources);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region + Buffer +
|
|
|
|
public virtual IObservable<IList<TSource>> Buffer<TSource, TBufferClosing>(IObservable<TSource> source, Func<IObservable<TBufferClosing>> bufferClosingSelector)
|
|
{
|
|
return new Buffer<TSource, TBufferClosing>.Selector(source, bufferClosingSelector);
|
|
}
|
|
|
|
public virtual IObservable<IList<TSource>> Buffer<TSource, TBufferOpening, TBufferClosing>(IObservable<TSource> source, IObservable<TBufferOpening> bufferOpenings, Func<TBufferOpening, IObservable<TBufferClosing>> bufferClosingSelector)
|
|
{
|
|
return source.Window(bufferOpenings, bufferClosingSelector).SelectMany(ToList);
|
|
}
|
|
|
|
public virtual IObservable<IList<TSource>> Buffer<TSource, TBufferBoundary>(IObservable<TSource> source, IObservable<TBufferBoundary> bufferBoundaries)
|
|
{
|
|
return new Buffer<TSource, TBufferBoundary>.Boundaries(source, bufferBoundaries);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region + Catch +
|
|
|
|
public virtual IObservable<TSource> Catch<TSource, TException>(IObservable<TSource> source, Func<TException, IObservable<TSource>> handler) where TException : Exception
|
|
{
|
|
return new Catch<TSource, TException>(source, handler);
|
|
}
|
|
|
|
public virtual IObservable<TSource> Catch<TSource>(IObservable<TSource> first, IObservable<TSource> second)
|
|
{
|
|
return Catch_(new[] { first, second });
|
|
}
|
|
|
|
public virtual IObservable<TSource> Catch<TSource>(params IObservable<TSource>[] sources)
|
|
{
|
|
return Catch_(sources);
|
|
}
|
|
|
|
public virtual IObservable<TSource> Catch<TSource>(IEnumerable<IObservable<TSource>> sources)
|
|
{
|
|
return Catch_(sources);
|
|
}
|
|
|
|
private static IObservable<TSource> Catch_<TSource>(IEnumerable<IObservable<TSource>> sources)
|
|
{
|
|
return new Catch<TSource>(sources);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region + CombineLatest +
|
|
|
|
public virtual IObservable<TResult> CombineLatest<TFirst, TSecond, TResult>(IObservable<TFirst> first, IObservable<TSecond> second, Func<TFirst, TSecond, TResult> resultSelector)
|
|
{
|
|
return new CombineLatest<TFirst, TSecond, TResult>(first, second, resultSelector);
|
|
}
|
|
|
|
public virtual IObservable<TResult> CombineLatest<TSource, TResult>(IEnumerable<IObservable<TSource>> sources, Func<IList<TSource>, TResult> resultSelector)
|
|
{
|
|
return CombineLatest_(sources, resultSelector);
|
|
}
|
|
|
|
public virtual IObservable<IList<TSource>> CombineLatest<TSource>(IEnumerable<IObservable<TSource>> sources)
|
|
{
|
|
return CombineLatest_(sources, res => res.ToList());
|
|
}
|
|
|
|
public virtual IObservable<IList<TSource>> CombineLatest<TSource>(params IObservable<TSource>[] sources)
|
|
{
|
|
return CombineLatest_(sources, res => res.ToList());
|
|
}
|
|
|
|
private static IObservable<TResult> CombineLatest_<TSource, TResult>(IEnumerable<IObservable<TSource>> sources, Func<IList<TSource>, TResult> resultSelector)
|
|
{
|
|
return new CombineLatest<TSource, TResult>(sources, resultSelector);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region + Concat +
|
|
|
|
public virtual IObservable<TSource> Concat<TSource>(IObservable<TSource> first, IObservable<TSource> second)
|
|
{
|
|
return Concat_(new[] { first, second });
|
|
}
|
|
|
|
public virtual IObservable<TSource> Concat<TSource>(params IObservable<TSource>[] sources)
|
|
{
|
|
return Concat_(sources);
|
|
}
|
|
|
|
public virtual IObservable<TSource> Concat<TSource>(IEnumerable<IObservable<TSource>> sources)
|
|
{
|
|
return Concat_(sources);
|
|
}
|
|
|
|
private static IObservable<TSource> Concat_<TSource>(IEnumerable<IObservable<TSource>> sources)
|
|
{
|
|
return new Concat<TSource>(sources);
|
|
}
|
|
|
|
public virtual IObservable<TSource> Concat<TSource>(IObservable<IObservable<TSource>> sources)
|
|
{
|
|
return Concat_(sources);
|
|
}
|
|
|
|
public virtual IObservable<TSource> Concat<TSource>(IObservable<Task<TSource>> sources)
|
|
{
|
|
return Concat_(Select(sources, TaskObservableExtensions.ToObservable));
|
|
}
|
|
|
|
private static IObservable<TSource> Concat_<TSource>(IObservable<IObservable<TSource>> sources)
|
|
{
|
|
return new ConcatMany<TSource>(sources);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region + Merge +
|
|
|
|
public virtual IObservable<TSource> Merge<TSource>(IObservable<IObservable<TSource>> sources)
|
|
{
|
|
return Merge_(sources);
|
|
}
|
|
|
|
public virtual IObservable<TSource> Merge<TSource>(IObservable<Task<TSource>> sources)
|
|
{
|
|
return new Merge<TSource>.Tasks(sources);
|
|
}
|
|
|
|
public virtual IObservable<TSource> Merge<TSource>(IObservable<IObservable<TSource>> sources, int maxConcurrent)
|
|
{
|
|
return Merge_(sources, maxConcurrent);
|
|
}
|
|
|
|
public virtual IObservable<TSource> Merge<TSource>(IEnumerable<IObservable<TSource>> sources, int maxConcurrent)
|
|
{
|
|
return Merge_(sources.ToObservable(SchedulerDefaults.ConstantTimeOperations), maxConcurrent);
|
|
}
|
|
|
|
public virtual IObservable<TSource> Merge<TSource>(IEnumerable<IObservable<TSource>> sources, int maxConcurrent, IScheduler scheduler)
|
|
{
|
|
return Merge_(sources.ToObservable(scheduler), maxConcurrent);
|
|
}
|
|
|
|
public virtual IObservable<TSource> Merge<TSource>(IObservable<TSource> first, IObservable<TSource> second)
|
|
{
|
|
return Merge_(new[] { first, second }.ToObservable(SchedulerDefaults.ConstantTimeOperations));
|
|
}
|
|
|
|
public virtual IObservable<TSource> Merge<TSource>(IObservable<TSource> first, IObservable<TSource> second, IScheduler scheduler)
|
|
{
|
|
return Merge_(new[] { first, second }.ToObservable(scheduler));
|
|
}
|
|
|
|
public virtual IObservable<TSource> Merge<TSource>(params IObservable<TSource>[] sources)
|
|
{
|
|
return Merge_(sources.ToObservable(SchedulerDefaults.ConstantTimeOperations));
|
|
}
|
|
|
|
public virtual IObservable<TSource> Merge<TSource>(IScheduler scheduler, params IObservable<TSource>[] sources)
|
|
{
|
|
return Merge_(sources.ToObservable(scheduler));
|
|
}
|
|
|
|
public virtual IObservable<TSource> Merge<TSource>(IEnumerable<IObservable<TSource>> sources)
|
|
{
|
|
return Merge_(sources.ToObservable(SchedulerDefaults.ConstantTimeOperations));
|
|
}
|
|
|
|
public virtual IObservable<TSource> Merge<TSource>(IEnumerable<IObservable<TSource>> sources, IScheduler scheduler)
|
|
{
|
|
return Merge_(sources.ToObservable(scheduler));
|
|
}
|
|
|
|
private static IObservable<TSource> Merge_<TSource>(IObservable<IObservable<TSource>> sources)
|
|
{
|
|
return new Merge<TSource>.Observables(sources);
|
|
}
|
|
|
|
private static IObservable<TSource> Merge_<TSource>(IObservable<IObservable<TSource>> sources, int maxConcurrent)
|
|
{
|
|
return new Merge<TSource>.ObservablesMaxConcurrency(sources, maxConcurrent);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region + OnErrorResumeNext +
|
|
|
|
public virtual IObservable<TSource> OnErrorResumeNext<TSource>(IObservable<TSource> first, IObservable<TSource> second)
|
|
{
|
|
return OnErrorResumeNext_(new[] { first, second });
|
|
}
|
|
|
|
public virtual IObservable<TSource> OnErrorResumeNext<TSource>(params IObservable<TSource>[] sources)
|
|
{
|
|
return OnErrorResumeNext_(sources);
|
|
}
|
|
|
|
public virtual IObservable<TSource> OnErrorResumeNext<TSource>(IEnumerable<IObservable<TSource>> sources)
|
|
{
|
|
return OnErrorResumeNext_(sources);
|
|
}
|
|
|
|
private static IObservable<TSource> OnErrorResumeNext_<TSource>(IEnumerable<IObservable<TSource>> sources)
|
|
{
|
|
return new OnErrorResumeNext<TSource>(sources);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region + SkipUntil +
|
|
|
|
public virtual IObservable<TSource> SkipUntil<TSource, TOther>(IObservable<TSource> source, IObservable<TOther> other)
|
|
{
|
|
return new SkipUntil<TSource, TOther>(source, other);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region + Switch +
|
|
|
|
public virtual IObservable<TSource> Switch<TSource>(IObservable<IObservable<TSource>> sources)
|
|
{
|
|
return Switch_(sources);
|
|
}
|
|
|
|
public virtual IObservable<TSource> Switch<TSource>(IObservable<Task<TSource>> sources)
|
|
{
|
|
return Switch_(Select(sources, TaskObservableExtensions.ToObservable));
|
|
}
|
|
|
|
private static IObservable<TSource> Switch_<TSource>(IObservable<IObservable<TSource>> sources)
|
|
{
|
|
return new Switch<TSource>(sources);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region + TakeUntil +
|
|
|
|
public virtual IObservable<TSource> TakeUntil<TSource, TOther>(IObservable<TSource> source, IObservable<TOther> other)
|
|
{
|
|
return new TakeUntil<TSource, TOther>(source, other);
|
|
}
|
|
|
|
public virtual IObservable<TSource> TakeUntil<TSource>(IObservable<TSource> source, Func<TSource, bool> stopPredicate)
|
|
{
|
|
return new TakeUntilPredicate<TSource>(source, stopPredicate);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region + Window +
|
|
|
|
public virtual IObservable<IObservable<TSource>> Window<TSource, TWindowClosing>(IObservable<TSource> source, Func<IObservable<TWindowClosing>> windowClosingSelector)
|
|
{
|
|
return new Window<TSource, TWindowClosing>.Selector(source, windowClosingSelector);
|
|
}
|
|
|
|
public virtual IObservable<IObservable<TSource>> Window<TSource, TWindowOpening, TWindowClosing>(IObservable<TSource> source, IObservable<TWindowOpening> windowOpenings, Func<TWindowOpening, IObservable<TWindowClosing>> windowClosingSelector)
|
|
{
|
|
return windowOpenings.GroupJoin(source, windowClosingSelector, _ => Observable.Empty<Unit>(), (_, window) => window);
|
|
}
|
|
|
|
public virtual IObservable<IObservable<TSource>> Window<TSource, TWindowBoundary>(IObservable<TSource> source, IObservable<TWindowBoundary> windowBoundaries)
|
|
{
|
|
return new Window<TSource, TWindowBoundary>.Boundaries(source, windowBoundaries);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region + WithLatestFrom +
|
|
|
|
public virtual IObservable<TResult> WithLatestFrom<TFirst, TSecond, TResult>(IObservable<TFirst> first, IObservable<TSecond> second, Func<TFirst, TSecond, TResult> resultSelector)
|
|
{
|
|
return new WithLatestFrom<TFirst, TSecond, TResult>(first, second, resultSelector);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region + Zip +
|
|
|
|
public virtual IObservable<TResult> Zip<TFirst, TSecond, TResult>(IObservable<TFirst> first, IObservable<TSecond> second, Func<TFirst, TSecond, TResult> resultSelector)
|
|
{
|
|
return new Zip<TFirst, TSecond, TResult>.Observable(first, second, resultSelector);
|
|
}
|
|
|
|
public virtual IObservable<TResult> Zip<TSource, TResult>(IEnumerable<IObservable<TSource>> sources, Func<IList<TSource>, TResult> resultSelector)
|
|
{
|
|
return Zip_(sources).Select(resultSelector);
|
|
}
|
|
|
|
public virtual IObservable<IList<TSource>> Zip<TSource>(IEnumerable<IObservable<TSource>> sources)
|
|
{
|
|
return Zip_(sources);
|
|
}
|
|
|
|
public virtual IObservable<IList<TSource>> Zip<TSource>(params IObservable<TSource>[] sources)
|
|
{
|
|
return Zip_(sources);
|
|
}
|
|
|
|
private static IObservable<IList<TSource>> Zip_<TSource>(IEnumerable<IObservable<TSource>> sources)
|
|
{
|
|
return new Zip<TSource>(sources);
|
|
}
|
|
|
|
public virtual IObservable<TResult> Zip<TFirst, TSecond, TResult>(IObservable<TFirst> first, IEnumerable<TSecond> second, Func<TFirst, TSecond, TResult> resultSelector)
|
|
{
|
|
return new Zip<TFirst, TSecond, TResult>.Enumerable(first, second, resultSelector);
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|