| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 | // 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. <#@ template debug="false" hostspecific="false" language="C#" #><#@ assembly name="System.Core" #><#@ import namespace="System.Linq" #><#@ import namespace="System.Text" #><#@ import namespace="System.Collections.Generic" #><#@ output extension=".cs" #>using System.Reactive.Subjects;namespace System.Reactive.Linq{    // REVIEW: Consider if these are worth retaining in the async space.    public partial class AsyncObservable    {<#for (var i = 0; i <= 14; i++){    var args = Enumerable.Range(1, i).Select(j => "T" + j).Concat(new[] { "IAsyncObservable<TResult>" });    var ret = "Func<" + string.Join(", ", args) + ">";    var genArgs = string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + j).Concat(new[] { "TResult" }));    var pars = string.Join(", ", Enumerable.Range(1, i).Select(j => "arg" + j));    var begin = "Func<" + string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + j).Concat(new[] { "AsyncCallback, object, IAsyncResult" })) + ">";    var end = "Func<IAsyncResult, TResult>";    var invokeArgs = pars;    if (i > 0)    {        invokeArgs = ", " + invokeArgs;    }#>        public static <#=ret#> FromAsyncPattern<<#=genArgs#>>(<#=begin#> begin, <#=end#> end)        {            if (begin == null)                throw new ArgumentNullException(nameof(begin));            if (end == null)                throw new ArgumentNullException(nameof(end));            return (<#=pars#>) =>            {                var subject = new SequentialAsyncAsyncSubject<TResult>();                try                {                    AsyncObserver.FromAsyncPattern(subject, begin, end<#=invokeArgs#>);                }                catch (Exception ex)                {                    return Throw<TResult>(ex);                }                return subject.AsAsyncObservable();            };        }<#}#><#for (var i = 0; i <= 14; i++){    var args = Enumerable.Range(1, i).Select(j => "T" + j).Concat(new[] { "IAsyncObservable<Unit>" });    var ret = "Func<" + string.Join(", ", args) + ">";    var genArgs = string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + j));    var pars = string.Join(", ", Enumerable.Range(1, i).Select(j => "arg" + j));    var begin = "Func<" + string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + j).Concat(new[] { "AsyncCallback, object, IAsyncResult" })) + ">";    var end = "Func<IAsyncResult, Unit>";    if (genArgs != "")    {        genArgs = "<" + genArgs + ">";    }    var invokeArgs = pars;    if (i > 0)    {        invokeArgs = ", " + invokeArgs;    }#>        public static <#=ret#> FromAsyncPattern<#=genArgs#>(<#=begin#> begin, <#=end#> end)        {            if (begin == null)                throw new ArgumentNullException(nameof(begin));            if (end == null)                throw new ArgumentNullException(nameof(end));            return (<#=pars#>) =>            {                var subject = new SequentialAsyncAsyncSubject<Unit>();                try                {                    AsyncObserver.FromAsyncPattern(subject, begin, end<#=invokeArgs#>);                }                catch (Exception ex)                {                    return Throw<Unit>(ex);                }                return subject.AsAsyncObservable();            };        }<#}#>    }    public partial class AsyncObserver    {<#for (var i = 0; i <= 14; i++){    var args = Enumerable.Range(1, i).Select(j => "T" + j).Concat(new[] { "IAsyncObservable<TResult>" });    var ret = "Func<" + string.Join(", ", args) + ">";    var genArgs = string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + j).Concat(new[] { "TResult" }));    var pars = string.Join(", ", Enumerable.Range(1, i).Select(j => "arg" + j));    var begin = "Func<" + string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + j).Concat(new[] { "AsyncCallback, object, IAsyncResult" })) + ">";    var end = "Func<IAsyncResult, TResult>";    var invokePars = string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + j + " arg" + j));    if (i > 0)    {        invokePars = ", " + invokePars;    }#>        public static IAsyncResult FromAsyncPattern<<#=genArgs#>>(IAsyncObserver<TResult> observer, <#=begin#> begin, <#=end#> end<#=invokePars#>)        {            if (observer == null)                throw new ArgumentNullException(nameof(observer));            if (begin == null)                throw new ArgumentNullException(nameof(begin));            if (end == null)                throw new ArgumentNullException(nameof(end));            return begin(<#=pars + (i > 0 ? ", " : "")#>async iar =>            {                TResult result;                try                {                    result = end(iar);                }                catch (Exception ex)                {                    await observer.OnErrorAsync(ex).ConfigureAwait(false);                    return;                }                await observer.OnNextAsync(result).ConfigureAwait(false);                await observer.OnCompletedAsync().ConfigureAwait(false);            }, null);        }<#}#><#for (var i = 0; i <= 14; i++){    var args = Enumerable.Range(1, i).Select(j => "T" + j).Concat(new[] { "IAsyncObservable<Unit>" });    var ret = "Func<" + string.Join(", ", args) + ">";    var genArgs = string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + j));    var pars = string.Join(", ", Enumerable.Range(1, i).Select(j => "arg" + j));    var begin = "Func<" + string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + j).Concat(new[] { "AsyncCallback, object, IAsyncResult" })) + ">";    var end = "Func<IAsyncResult, Unit>";    if (genArgs != "")    {        genArgs = "<" + genArgs + ">";    }    var invokePars = string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + j + " arg" + j));    var invokeArgs = pars;    if (i > 0)    {        invokePars = ", " + invokePars;        invokeArgs = ", " + invokeArgs;    }#>        public static IAsyncResult FromAsyncPattern<#=genArgs#>(IAsyncObserver<Unit> observer, <#=begin#> begin, <#=end#> end<#=invokePars#>)        {            if (observer == null)                throw new ArgumentNullException(nameof(observer));            if (begin == null)                throw new ArgumentNullException(nameof(begin));            if (end == null)                throw new ArgumentNullException(nameof(end));            return FromAsyncPattern(observer, begin, iar =>            {                end(iar);                return Unit.Default;            }<#=invokeArgs#>);        }<#}#>    }}
 |