// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. using System.Reactive.Concurrency; using System.Reactive.Disposables; using System.Reactive.Subjects; #if !NO_TPL using System.Reactive.Threading.Tasks; using System.Threading; using System.Threading.Tasks; #endif namespace System.Reactive.Linq { internal partial class QueryLanguage { #region FromAsyncPattern #region Func public virtual Func> FromAsyncPattern(Func begin, Func end) { return () => { var subject = new AsyncSubject(); try { begin(iar => { // Note: Even if the callback completes synchronously, outgoing On* calls // cannot throw in user code since there can't be any subscribers // to the AsyncSubject yet. Therefore, there is no need to protect // against exceptions that'd be caught below and sent (incorrectly) // into the Observable.Throw sequence being constructed. TResult result; try { result = end(iar); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }, null); } catch (Exception exception) { return Observable.Throw(exception, SchedulerDefaults.AsyncConversions); } return subject.AsObservable(); }; } public virtual Func> FromAsyncPattern(Func begin, Func end) { return x => { var subject = new AsyncSubject(); try { begin(x, iar => { // See remark on FromAsyncPattern. TResult result; try { result = end(iar); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }, null); } catch (Exception exception) { return Observable.Throw(exception, SchedulerDefaults.AsyncConversions); } return subject.AsObservable(); }; } public virtual Func> FromAsyncPattern(Func begin, Func end) { return (x, y) => { var subject = new AsyncSubject(); try { begin(x, y, iar => { // See remark on FromAsyncPattern. TResult result; try { result = end(iar); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }, null); } catch (Exception exception) { return Observable.Throw(exception, SchedulerDefaults.AsyncConversions); } return subject.AsObservable(); }; } #if !NO_LARGEARITY public virtual Func> FromAsyncPattern(Func begin, Func end) { return (x, y, z) => { var subject = new AsyncSubject(); try { begin(x, y, z, iar => { // See remark on FromAsyncPattern. TResult result; try { result = end(iar); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }, null); } catch (Exception exception) { return Observable.Throw(exception, SchedulerDefaults.AsyncConversions); } return subject.AsObservable(); }; } public virtual Func> FromAsyncPattern(Func begin, Func end) { return (x, y, z, a) => { var subject = new AsyncSubject(); try { begin(x, y, z, a, iar => { // See remark on FromAsyncPattern. TResult result; try { result = end(iar); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }, null); } catch (Exception exception) { return Observable.Throw(exception, SchedulerDefaults.AsyncConversions); } return subject.AsObservable(); }; } public virtual Func> FromAsyncPattern(Func begin, Func end) { return (x, y, z, a, b) => { var subject = new AsyncSubject(); try { begin(x, y, z, a, b, iar => { // See remark on FromAsyncPattern. TResult result; try { result = end(iar); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }, null); } catch (Exception exception) { return Observable.Throw(exception, SchedulerDefaults.AsyncConversions); } return subject.AsObservable(); }; } public virtual Func> FromAsyncPattern(Func begin, Func end) { return (x, y, z, a, b, c) => { var subject = new AsyncSubject(); try { begin(x, y, z, a, b, c, iar => { // See remark on FromAsyncPattern. TResult result; try { result = end(iar); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }, null); } catch (Exception exception) { return Observable.Throw(exception, SchedulerDefaults.AsyncConversions); } return subject.AsObservable(); }; } public virtual Func> FromAsyncPattern(Func begin, Func end) { return (x, y, z, a, b, c, d) => { var subject = new AsyncSubject(); try { begin(x, y, z, a, b, c, d, iar => { // See remark on FromAsyncPattern. TResult result; try { result = end(iar); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }, null); } catch (Exception exception) { return Observable.Throw(exception, SchedulerDefaults.AsyncConversions); } return subject.AsObservable(); }; } public virtual Func> FromAsyncPattern(Func begin, Func end) { return (x, y, z, a, b, c, d, e) => { var subject = new AsyncSubject(); try { begin(x, y, z, a, b, c, d, e, iar => { // See remark on FromAsyncPattern. TResult result; try { result = end(iar); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }, null); } catch (Exception exception) { return Observable.Throw(exception, SchedulerDefaults.AsyncConversions); } return subject.AsObservable(); }; } public virtual Func> FromAsyncPattern(Func begin, Func end) { return (x, y, z, a, b, c, d, e, f) => { var subject = new AsyncSubject(); try { begin(x, y, z, a, b, c, d, e, f, iar => { // See remark on FromAsyncPattern. TResult result; try { result = end(iar); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }, null); } catch (Exception exception) { return Observable.Throw(exception, SchedulerDefaults.AsyncConversions); } return subject.AsObservable(); }; } public virtual Func> FromAsyncPattern(Func begin, Func end) { return (x, y, z, a, b, c, d, e, f, g) => { var subject = new AsyncSubject(); try { begin(x, y, z, a, b, c, d, e, f, g, iar => { // See remark on FromAsyncPattern. TResult result; try { result = end(iar); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }, null); } catch (Exception exception) { return Observable.Throw(exception, SchedulerDefaults.AsyncConversions); } return subject.AsObservable(); }; } public virtual Func> FromAsyncPattern(Func begin, Func end) { return (x, y, z, a, b, c, d, e, f, g, h) => { var subject = new AsyncSubject(); try { begin(x, y, z, a, b, c, d, e, f, g, h, iar => { // See remark on FromAsyncPattern. TResult result; try { result = end(iar); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }, null); } catch (Exception exception) { return Observable.Throw(exception, SchedulerDefaults.AsyncConversions); } return subject.AsObservable(); }; } public virtual Func> FromAsyncPattern(Func begin, Func end) { return (x, y, z, a, b, c, d, e, f, g, h, i) => { var subject = new AsyncSubject(); try { begin(x, y, z, a, b, c, d, e, f, g, h, i, iar => { // See remark on FromAsyncPattern. TResult result; try { result = end(iar); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }, null); } catch (Exception exception) { return Observable.Throw(exception, SchedulerDefaults.AsyncConversions); } return subject.AsObservable(); }; } public virtual Func> FromAsyncPattern(Func begin, Func end) { return (x, y, z, a, b, c, d, e, f, g, h, i, j) => { var subject = new AsyncSubject(); try { begin(x, y, z, a, b, c, d, e, f, g, h, i, j, iar => { // See remark on FromAsyncPattern. TResult result; try { result = end(iar); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }, null); } catch (Exception exception) { return Observable.Throw(exception, SchedulerDefaults.AsyncConversions); } return subject.AsObservable(); }; } public virtual Func> FromAsyncPattern(Func begin, Func end) { return (x, y, z, a, b, c, d, e, f, g, h, i, j, k) => { var subject = new AsyncSubject(); try { begin(x, y, z, a, b, c, d, e, f, g, h, i, j, k, iar => { // See remark on FromAsyncPattern. TResult result; try { result = end(iar); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }, null); } catch (Exception exception) { return Observable.Throw(exception, SchedulerDefaults.AsyncConversions); } return subject.AsObservable(); }; } #endif #endregion #region Action public virtual Func> FromAsyncPattern(Func begin, Action end) { return FromAsyncPattern(begin, iar => { end(iar); return Unit.Default; }); } public virtual Func> FromAsyncPattern(Func begin, Action end) { return FromAsyncPattern(begin, iar => { end(iar); return Unit.Default; }); } public virtual Func> FromAsyncPattern(Func begin, Action end) { return FromAsyncPattern(begin, iar => { end(iar); return Unit.Default; }); } #if !NO_LARGEARITY public virtual Func> FromAsyncPattern(Func begin, Action end) { return FromAsyncPattern(begin, iar => { end(iar); return Unit.Default; }); } public virtual Func> FromAsyncPattern(Func begin, Action end) { return FromAsyncPattern(begin, iar => { end(iar); return Unit.Default; }); } public virtual Func> FromAsyncPattern(Func begin, Action end) { return FromAsyncPattern(begin, iar => { end(iar); return Unit.Default; }); } public virtual Func> FromAsyncPattern(Func begin, Action end) { return FromAsyncPattern(begin, iar => { end(iar); return Unit.Default; }); } public virtual Func> FromAsyncPattern(Func begin, Action end) { return FromAsyncPattern(begin, iar => { end(iar); return Unit.Default; }); } public virtual Func> FromAsyncPattern(Func begin, Action end) { return FromAsyncPattern(begin, iar => { end(iar); return Unit.Default; }); } public virtual Func> FromAsyncPattern(Func begin, Action end) { return FromAsyncPattern(begin, iar => { end(iar); return Unit.Default; }); } public virtual Func> FromAsyncPattern(Func begin, Action end) { return FromAsyncPattern(begin, iar => { end(iar); return Unit.Default; }); } public virtual Func> FromAsyncPattern(Func begin, Action end) { return FromAsyncPattern(begin, iar => { end(iar); return Unit.Default; }); } public virtual Func> FromAsyncPattern(Func begin, Action end) { return FromAsyncPattern(begin, iar => { end(iar); return Unit.Default; }); } public virtual Func> FromAsyncPattern(Func begin, Action end) { return FromAsyncPattern(begin, iar => { end(iar); return Unit.Default; }); } public virtual Func> FromAsyncPattern(Func begin, Action end) { return FromAsyncPattern(begin, iar => { end(iar); return Unit.Default; }); } #endif #endregion #endregion #region Start[Async] #region Func public virtual IObservable Start(Func function) { return ToAsync(function)(); } public virtual IObservable Start(Func function, IScheduler scheduler) { return ToAsync(function, scheduler)(); } #if !NO_TPL public virtual IObservable StartAsync(Func> functionAsync) { var task = default(Task); try { task = functionAsync(); } catch (Exception exception) { return Throw(exception); } return task.ToObservable(); } public virtual IObservable StartAsync(Func> functionAsync) { var cancellable = new CancellationDisposable(); var task = default(Task); try { task = functionAsync(cancellable.Token); } catch (Exception exception) { return Throw(exception); } var result = task.ToObservable(); return new AnonymousObservable(observer => { // // [OK] Use of unsafe Subscribe: result is an AsyncSubject. // var subscription = result.Subscribe/*Unsafe*/(observer); return new CompositeDisposable(cancellable, subscription); }); } #endif #endregion #region Action public virtual IObservable Start(Action action) { return ToAsync(action, SchedulerDefaults.AsyncConversions)(); } public virtual IObservable Start(Action action, IScheduler scheduler) { return ToAsync(action, scheduler)(); } #if !NO_TPL public virtual IObservable StartAsync(Func actionAsync) { var task = default(Task); try { task = actionAsync(); } catch (Exception exception) { return Throw(exception); } return task.ToObservable(); } public virtual IObservable StartAsync(Func actionAsync) { var cancellable = new CancellationDisposable(); var task = default(Task); try { task = actionAsync(cancellable.Token); } catch (Exception exception) { return Throw(exception); } var result = task.ToObservable(); return new AnonymousObservable(observer => { // // [OK] Use of unsafe Subscribe: result is an AsyncSubject. // var subscription = result.Subscribe/*Unsafe*/(observer); return new CompositeDisposable(cancellable, subscription); }); } #endif #endregion #endregion #region FromAsync #if !NO_TPL #region Func public virtual IObservable FromAsync(Func> functionAsync) { return Defer(() => StartAsync(functionAsync)); } public virtual IObservable FromAsync(Func> functionAsync) { return Defer(() => StartAsync(functionAsync)); } #endregion #region Action public virtual IObservable FromAsync(Func actionAsync) { return Defer(() => StartAsync(actionAsync)); } public virtual IObservable FromAsync(Func actionAsync) { return Defer(() => StartAsync(actionAsync)); } #endregion #endif #endregion #region ToAsync #region Func public virtual Func> ToAsync(Func function) { return ToAsync(function, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Func function, IScheduler scheduler) { return () => { var subject = new AsyncSubject(); scheduler.Schedule(() => { var result = default(TResult); try { result = function(); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Func function) { return ToAsync(function, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Func function, IScheduler scheduler) { return (first) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { var result = default(TResult); try { result = function(first); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Func function) { return ToAsync(function, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Func function, IScheduler scheduler) { return (first, second) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { var result = default(TResult); try { result = function(first, second); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Func function) { return ToAsync(function, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Func function, IScheduler scheduler) { return (first, second, third) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { var result = default(TResult); try { result = function(first, second, third); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Func function) { return ToAsync(function, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Func function, IScheduler scheduler) { return (first, second, third, fourth) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { var result = default(TResult); try { result = function(first, second, third, fourth); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }); return subject.AsObservable(); }; } #if !NO_LARGEARITY public virtual Func> ToAsync(Func function) { return ToAsync(function, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Func function, IScheduler scheduler) { return (first, second, third, fourth, fifth) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { var result = default(TResult); try { result = function(first, second, third, fourth, fifth); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Func function) { return ToAsync(function, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Func function, IScheduler scheduler) { return (first, second, third, fourth, fifth, sixth) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { var result = default(TResult); try { result = function(first, second, third, fourth, fifth, sixth); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Func function) { return ToAsync(function, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Func function, IScheduler scheduler) { return (first, second, third, fourth, fifth, sixth, seventh) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { var result = default(TResult); try { result = function(first, second, third, fourth, fifth, sixth, seventh); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Func function) { return ToAsync(function, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Func function, IScheduler scheduler) { return (first, second, third, fourth, fifth, sixth, seventh, eight) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { var result = default(TResult); try { result = function(first, second, third, fourth, fifth, sixth, seventh, eight); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Func function) { return ToAsync(function, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Func function, IScheduler scheduler) { return (first, second, third, fourth, fifth, sixth, seventh, eight, ninth) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { var result = default(TResult); try { result = function(first, second, third, fourth, fifth, sixth, seventh, eight, ninth); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Func function) { return ToAsync(function, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Func function, IScheduler scheduler) { return (first, second, third, fourth, fifth, sixth, seventh, eight, ninth, tenth) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { var result = default(TResult); try { result = function(first, second, third, fourth, fifth, sixth, seventh, eight, ninth, tenth); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Func function) { return ToAsync(function, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Func function, IScheduler scheduler) { return (first, second, third, fourth, fifth, sixth, seventh, eight, ninth, tenth, eleventh) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { var result = default(TResult); try { result = function(first, second, third, fourth, fifth, sixth, seventh, eight, ninth, tenth, eleventh); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Func function) { return ToAsync(function, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Func function, IScheduler scheduler) { return (first, second, third, fourth, fifth, sixth, seventh, eight, ninth, tenth, eleventh, twelfth) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { var result = default(TResult); try { result = function(first, second, third, fourth, fifth, sixth, seventh, eight, ninth, tenth, eleventh, twelfth); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Func function) { return ToAsync(function, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Func function, IScheduler scheduler) { return (first, second, third, fourth, fifth, sixth, seventh, eight, ninth, tenth, eleventh, twelfth, thirteenth) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { var result = default(TResult); try { result = function(first, second, third, fourth, fifth, sixth, seventh, eight, ninth, tenth, eleventh, twelfth, thirteenth); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Func function) { return ToAsync(function, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Func function, IScheduler scheduler) { return (first, second, third, fourth, fifth, sixth, seventh, eight, ninth, tenth, eleventh, twelfth, thirteenth, fourteenth) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { var result = default(TResult); try { result = function(first, second, third, fourth, fifth, sixth, seventh, eight, ninth, tenth, eleventh, twelfth, thirteenth, fourteenth); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Func function) { return ToAsync(function, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Func function, IScheduler scheduler) { return (first, second, third, fourth, fifth, sixth, seventh, eight, ninth, tenth, eleventh, twelfth, thirteenth, fourteenth, fifteenth) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { var result = default(TResult); try { result = function(first, second, third, fourth, fifth, sixth, seventh, eight, ninth, tenth, eleventh, twelfth, thirteenth, fourteenth, fifteenth); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Func function) { return ToAsync(function, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Func function, IScheduler scheduler) { return (first, second, third, fourth, fifth, sixth, seventh, eight, ninth, tenth, eleventh, twelfth, thirteenth, fourteenth, fifteenth, sixteenth) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { var result = default(TResult); try { result = function(first, second, third, fourth, fifth, sixth, seventh, eight, ninth, tenth, eleventh, twelfth, thirteenth, fourteenth, fifteenth, sixteenth); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(result); subject.OnCompleted(); }); return subject.AsObservable(); }; } #endif #endregion #region Action public virtual Func> ToAsync(Action action) { return ToAsync(action, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Action action, IScheduler scheduler) { return () => { var subject = new AsyncSubject(); scheduler.Schedule(() => { try { action(); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(Unit.Default); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Action action) { return ToAsync(action, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Action action, IScheduler scheduler) { return (first) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { try { action(first); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(Unit.Default); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Action action) { return ToAsync(action, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Action action, IScheduler scheduler) { return (first, second) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { try { action(first, second); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(Unit.Default); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Action action) { return ToAsync(action, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Action action, IScheduler scheduler) { return (first, second, third) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { try { action(first, second, third); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(Unit.Default); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Action action) { return ToAsync(action, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Action action, IScheduler scheduler) { return (first, second, third, fourth) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { try { action(first, second, third, fourth); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(Unit.Default); subject.OnCompleted(); }); return subject.AsObservable(); }; } #if !NO_LARGEARITY public virtual Func> ToAsync(Action action) { return ToAsync(action, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Action action, IScheduler scheduler) { return (first, second, third, fourth, fifth) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { try { action(first, second, third, fourth, fifth); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(Unit.Default); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Action action) { return ToAsync(action, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Action action, IScheduler scheduler) { return (first, second, third, fourth, fifth, sixth) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { try { action(first, second, third, fourth, fifth, sixth); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(Unit.Default); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Action action) { return ToAsync(action, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Action action, IScheduler scheduler) { return (first, second, third, fourth, fifth, sixth, seventh) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { try { action(first, second, third, fourth, fifth, sixth, seventh); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(Unit.Default); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Action action) { return ToAsync(action, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Action action, IScheduler scheduler) { return (first, second, third, fourth, fifth, sixth, seventh, eight) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { try { action(first, second, third, fourth, fifth, sixth, seventh, eight); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(Unit.Default); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Action action) { return ToAsync(action, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Action action, IScheduler scheduler) { return (first, second, third, fourth, fifth, sixth, seventh, eighth, ninth) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { try { action(first, second, third, fourth, fifth, sixth, seventh, eighth, ninth); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(Unit.Default); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Action action) { return ToAsync(action, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Action action, IScheduler scheduler) { return (first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { try { action(first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(Unit.Default); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Action action) { return ToAsync(action, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Action action, IScheduler scheduler) { return (first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { try { action(first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(Unit.Default); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Action action) { return ToAsync(action, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Action action, IScheduler scheduler) { return (first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh, twelfth) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { try { action(first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh, twelfth); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(Unit.Default); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Action action) { return ToAsync(action, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Action action, IScheduler scheduler) { return (first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh, twelfth, thirteenth) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { try { action(first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh, twelfth, thirteenth); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(Unit.Default); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Action action) { return ToAsync(action, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Action action, IScheduler scheduler) { return (first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh, twelfth, thirteenth, fourteenth) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { try { action(first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh, twelfth, thirteenth, fourteenth); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(Unit.Default); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Action action) { return ToAsync(action, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Action action, IScheduler scheduler) { return (first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh, twelfth, thirteenth, fourteenth, fifteenth) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { try { action(first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh, twelfth, thirteenth, fourteenth, fifteenth); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(Unit.Default); subject.OnCompleted(); }); return subject.AsObservable(); }; } public virtual Func> ToAsync(Action action) { return ToAsync(action, SchedulerDefaults.AsyncConversions); } public virtual Func> ToAsync(Action action, IScheduler scheduler) { return (first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh, twelfth, thirteenth, fourteenth, fifteenth, sixteenth) => { var subject = new AsyncSubject(); scheduler.Schedule(() => { try { action(first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh, twelfth, thirteenth, fourteenth, fifteenth, sixteenth); } catch (Exception exception) { subject.OnError(exception); return; } subject.OnNext(Unit.Default); subject.OnCompleted(); }); return subject.AsObservable(); }; } #endif #endregion #endregion } }