using System; namespace UniRx { public static partial class Observable { public static Func> FromAsyncPattern(Func begin, Func end) { return () => { var subject = new AsyncSubject(); try { begin(iar => { 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, Scheduler.DefaultSchedulers.AsyncConversions); } return subject.AsObservable(); }; } public static Func> FromAsyncPattern(Func begin, Func end) { return x => { var subject = new AsyncSubject(); try { begin(x, iar => { 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, Scheduler.DefaultSchedulers.AsyncConversions); } return subject.AsObservable(); }; } public static Func> FromAsyncPattern(Func begin, Func end) { return (x, y) => { var subject = new AsyncSubject(); try { begin(x, y, iar => { 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, Scheduler.DefaultSchedulers.AsyncConversions); } return subject.AsObservable(); }; } public static Func> FromAsyncPattern(Func begin, Action end) { return FromAsyncPattern(begin, iar => { end(iar); return Unit.Default; }); } public static Func> FromAsyncPattern(Func begin, Action end) { return FromAsyncPattern(begin, iar => { end(iar); return Unit.Default; }); } public static Func> FromAsyncPattern(Func begin, Action end) { return FromAsyncPattern(begin, iar => { end(iar); return Unit.Default; }); } } }