using System; using System.Collections.Generic; using System.Text; using System.Linq; using UniRx.Operators; namespace UniRx { // concatenate multiple observable // merge, concat, zip... public static partial class Observable { static IEnumerable> CombineSources(IObservable first, IObservable[] seconds) { yield return first; for (int i = 0; i < seconds.Length; i++) { yield return seconds[i]; } } public static IObservable Concat(params IObservable[] sources) { if (sources == null) throw new ArgumentNullException("sources"); return new ConcatObservable(sources); } public static IObservable Concat(this IEnumerable> sources) { if (sources == null) throw new ArgumentNullException("sources"); return new ConcatObservable(sources); } public static IObservable Concat(this IObservable> sources) { return sources.Merge(maxConcurrent: 1); } public static IObservable Concat(this IObservable first, params IObservable[] seconds) { if (first == null) throw new ArgumentNullException("first"); if (seconds == null) throw new ArgumentNullException("seconds"); var concat = first as ConcatObservable; if (concat != null) { return concat.Combine(seconds); } return Concat(CombineSources(first, seconds)); } public static IObservable Merge(this IEnumerable> sources) { return Merge(sources, Scheduler.DefaultSchedulers.ConstantTimeOperations); } public static IObservable Merge(this IEnumerable> sources, IScheduler scheduler) { return new MergeObservable(sources.ToObservable(scheduler), scheduler == Scheduler.CurrentThread); } public static IObservable Merge(this IEnumerable> sources, int maxConcurrent) { return Merge(sources, maxConcurrent, Scheduler.DefaultSchedulers.ConstantTimeOperations); } public static IObservable Merge(this IEnumerable> sources, int maxConcurrent, IScheduler scheduler) { return new MergeObservable(sources.ToObservable(scheduler), maxConcurrent, scheduler == Scheduler.CurrentThread); } public static IObservable Merge(params IObservable[] sources) { return Merge(Scheduler.DefaultSchedulers.ConstantTimeOperations, sources); } public static IObservable Merge(IScheduler scheduler, params IObservable[] sources) { return new MergeObservable(sources.ToObservable(scheduler), scheduler == Scheduler.CurrentThread); } public static IObservable Merge(this IObservable first, params IObservable[] seconds) { return Merge(CombineSources(first, seconds)); } public static IObservable Merge(this IObservable first, IObservable second, IScheduler scheduler) { return Merge(scheduler, new[] { first, second }); } public static IObservable Merge(this IObservable> sources) { return new MergeObservable(sources, false); } public static IObservable Merge(this IObservable> sources, int maxConcurrent) { return new MergeObservable(sources, maxConcurrent, false); } public static IObservable Zip(this IObservable left, IObservable right, Func selector) { return new ZipObservable(left, right, selector); } public static IObservable> Zip(this IEnumerable> sources) { return Zip(sources.ToArray()); } public static IObservable> Zip(params IObservable[] sources) { return new ZipObservable(sources); } public static IObservable Zip(this IObservable source1, IObservable source2, IObservable source3, ZipFunc resultSelector) { return new ZipObservable(source1, source2, source3, resultSelector); } public static IObservable Zip(this IObservable source1, IObservable source2, IObservable source3, IObservable source4, ZipFunc resultSelector) { return new ZipObservable(source1, source2, source3, source4, resultSelector); } public static IObservable Zip(this IObservable source1, IObservable source2, IObservable source3, IObservable source4, IObservable source5, ZipFunc resultSelector) { return new ZipObservable(source1, source2, source3, source4, source5, resultSelector); } public static IObservable Zip(this IObservable source1, IObservable source2, IObservable source3, IObservable source4, IObservable source5, IObservable source6, ZipFunc resultSelector) { return new ZipObservable(source1, source2, source3, source4, source5, source6, resultSelector); } public static IObservable Zip(this IObservable source1, IObservable source2, IObservable source3, IObservable source4, IObservable source5, IObservable source6, IObservable source7, ZipFunc resultSelector) { return new ZipObservable(source1, source2, source3, source4, source5, source6, source7, resultSelector); } public static IObservable CombineLatest(this IObservable left, IObservable right, Func selector) { return new CombineLatestObservable(left, right, selector); } public static IObservable> CombineLatest(this IEnumerable> sources) { return CombineLatest(sources.ToArray()); } public static IObservable> CombineLatest(params IObservable[] sources) { return new CombineLatestObservable(sources); } public static IObservable CombineLatest(this IObservable source1, IObservable source2, IObservable source3, CombineLatestFunc resultSelector) { return new CombineLatestObservable(source1, source2, source3, resultSelector); } public static IObservable CombineLatest(this IObservable source1, IObservable source2, IObservable source3, IObservable source4, CombineLatestFunc resultSelector) { return new CombineLatestObservable(source1, source2, source3, source4, resultSelector); } public static IObservable CombineLatest(this IObservable source1, IObservable source2, IObservable source3, IObservable source4, IObservable source5, CombineLatestFunc resultSelector) { return new CombineLatestObservable(source1, source2, source3, source4, source5, resultSelector); } public static IObservable CombineLatest(this IObservable source1, IObservable source2, IObservable source3, IObservable source4, IObservable source5, IObservable source6, CombineLatestFunc resultSelector) { return new CombineLatestObservable(source1, source2, source3, source4, source5, source6, resultSelector); } public static IObservable CombineLatest(this IObservable source1, IObservable source2, IObservable source3, IObservable source4, IObservable source5, IObservable source6, IObservable source7, CombineLatestFunc resultSelector) { return new CombineLatestObservable(source1, source2, source3, source4, source5, source6, source7, resultSelector); } public static IObservable ZipLatest(this IObservable left, IObservable right, Func selector) { return new ZipLatestObservable(left, right, selector); } public static IObservable> ZipLatest(this IEnumerable> sources) { return ZipLatest(sources.ToArray()); } public static IObservable> ZipLatest(params IObservable[] sources) { return new ZipLatestObservable(sources); } public static IObservable ZipLatest(this IObservable source1, IObservable source2, IObservable source3, ZipLatestFunc resultSelector) { return new ZipLatestObservable(source1, source2, source3, resultSelector); } public static IObservable ZipLatest(this IObservable source1, IObservable source2, IObservable source3, IObservable source4, ZipLatestFunc resultSelector) { return new ZipLatestObservable(source1, source2, source3, source4, resultSelector); } public static IObservable ZipLatest(this IObservable source1, IObservable source2, IObservable source3, IObservable source4, IObservable source5, ZipLatestFunc resultSelector) { return new ZipLatestObservable(source1, source2, source3, source4, source5, resultSelector); } public static IObservable ZipLatest(this IObservable source1, IObservable source2, IObservable source3, IObservable source4, IObservable source5, IObservable source6, ZipLatestFunc resultSelector) { return new ZipLatestObservable(source1, source2, source3, source4, source5, source6, resultSelector); } public static IObservable ZipLatest(this IObservable source1, IObservable source2, IObservable source3, IObservable source4, IObservable source5, IObservable source6, IObservable source7, ZipLatestFunc resultSelector) { return new ZipLatestObservable(source1, source2, source3, source4, source5, source6, source7, resultSelector); } public static IObservable Switch(this IObservable> sources) { return new SwitchObservable(sources); } public static IObservable WithLatestFrom(this IObservable left, IObservable right, Func selector) { return new WithLatestFromObservable(left, right, selector); } /// /// Specialized for single async operations like Task.WhenAll, Zip.Take(1). /// If sequence is empty, return T[0] array. /// public static IObservable WhenAll(params IObservable[] sources) { if (sources.Length == 0) return Observable.Return(new T[0]); return new WhenAllObservable(sources); } /// /// Specialized for single async operations like Task.WhenAll, Zip.Take(1). /// public static IObservable WhenAll(params IObservable[] sources) { if (sources.Length == 0) return Observable.ReturnUnit(); return new WhenAllObservable(sources); } /// /// Specialized for single async operations like Task.WhenAll, Zip.Take(1). /// If sequence is empty, return T[0] array. /// public static IObservable WhenAll(this IEnumerable> sources) { var array = sources as IObservable[]; if (array != null) return WhenAll(array); return new WhenAllObservable(sources); } /// /// Specialized for single async operations like Task.WhenAll, Zip.Take(1). /// public static IObservable WhenAll(this IEnumerable> sources) { var array = sources as IObservable[]; if (array != null) return WhenAll(array); return new WhenAllObservable(sources); } public static IObservable StartWith(this IObservable source, T value) { return new StartWithObservable(source, value); } public static IObservable StartWith(this IObservable source, Func valueFactory) { return new StartWithObservable(source, valueFactory); } public static IObservable StartWith(this IObservable source, params T[] values) { return StartWith(source, Scheduler.DefaultSchedulers.ConstantTimeOperations, values); } public static IObservable StartWith(this IObservable source, IEnumerable values) { return StartWith(source, Scheduler.DefaultSchedulers.ConstantTimeOperations, values); } public static IObservable StartWith(this IObservable source, IScheduler scheduler, T value) { return Observable.Return(value, scheduler).Concat(source); } public static IObservable StartWith(this IObservable source, IScheduler scheduler, IEnumerable values) { var array = values as T[]; if (array == null) { array = values.ToArray(); } return StartWith(source, scheduler, array); } public static IObservable StartWith(this IObservable source, IScheduler scheduler, params T[] values) { return values.ToObservable(scheduler).Concat(source); } } }