// 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.Reactive.Concurrency; using System.Reactive.Disposables; using System.Threading.Tasks; namespace System.Reactive.Linq { public partial class AsyncObservable { public static IAsyncObservable<(T1 arg1, T2 arg2)> FromEvent(Action> addHandler, Action> removeHandler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore, T1, T2>(h => h, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2)> FromEvent(Action> addHandler, Action> removeHandler, IAsyncScheduler scheduler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore, T1, T2>(h => h, addHandler, removeHandler, scheduler); } public static IAsyncObservable<(T1 arg1, T2 arg2)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore(conversion, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore(conversion, addHandler, removeHandler, scheduler); } private static IAsyncObservable<(T1 arg1, T2 arg2)> FromEventCore(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { return SynchronizeEvents( Create<(T1 arg1, T2 arg2)>(observer => { var handler = new Action((arg1, arg2) => { observer.OnNextAsync((arg1, arg2)); // REVIEW: Fire-and-forget can lead to out of order processing, and observers may reject these calls as "busy". }); var converted = conversion(handler); addHandler(converted); return new ValueTask(AsyncDisposable.Create(() => { removeHandler(converted); return default; })); }), scheduler ); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3)> FromEvent(Action> addHandler, Action> removeHandler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore, T1, T2, T3>(h => h, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3)> FromEvent(Action> addHandler, Action> removeHandler, IAsyncScheduler scheduler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore, T1, T2, T3>(h => h, addHandler, removeHandler, scheduler); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore(conversion, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore(conversion, addHandler, removeHandler, scheduler); } private static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3)> FromEventCore(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { return SynchronizeEvents( Create<(T1 arg1, T2 arg2, T3 arg3)>(observer => { var handler = new Action((arg1, arg2, arg3) => { observer.OnNextAsync((arg1, arg2, arg3)); // REVIEW: Fire-and-forget can lead to out of order processing, and observers may reject these calls as "busy". }); var converted = conversion(handler); addHandler(converted); return new ValueTask(AsyncDisposable.Create(() => { removeHandler(converted); return default; })); }), scheduler ); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4)> FromEvent(Action> addHandler, Action> removeHandler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore, T1, T2, T3, T4>(h => h, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4)> FromEvent(Action> addHandler, Action> removeHandler, IAsyncScheduler scheduler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore, T1, T2, T3, T4>(h => h, addHandler, removeHandler, scheduler); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore(conversion, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore(conversion, addHandler, removeHandler, scheduler); } private static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4)> FromEventCore(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { return SynchronizeEvents( Create<(T1 arg1, T2 arg2, T3 arg3, T4 arg4)>(observer => { var handler = new Action((arg1, arg2, arg3, arg4) => { observer.OnNextAsync((arg1, arg2, arg3, arg4)); // REVIEW: Fire-and-forget can lead to out of order processing, and observers may reject these calls as "busy". }); var converted = conversion(handler); addHandler(converted); return new ValueTask(AsyncDisposable.Create(() => { removeHandler(converted); return default; })); }), scheduler ); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5)> FromEvent(Action> addHandler, Action> removeHandler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore, T1, T2, T3, T4, T5>(h => h, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5)> FromEvent(Action> addHandler, Action> removeHandler, IAsyncScheduler scheduler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore, T1, T2, T3, T4, T5>(h => h, addHandler, removeHandler, scheduler); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore(conversion, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore(conversion, addHandler, removeHandler, scheduler); } private static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5)> FromEventCore(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { return SynchronizeEvents( Create<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5)>(observer => { var handler = new Action((arg1, arg2, arg3, arg4, arg5) => { observer.OnNextAsync((arg1, arg2, arg3, arg4, arg5)); // REVIEW: Fire-and-forget can lead to out of order processing, and observers may reject these calls as "busy". }); var converted = conversion(handler); addHandler(converted); return new ValueTask(AsyncDisposable.Create(() => { removeHandler(converted); return default; })); }), scheduler ); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6)> FromEvent(Action> addHandler, Action> removeHandler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore, T1, T2, T3, T4, T5, T6>(h => h, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6)> FromEvent(Action> addHandler, Action> removeHandler, IAsyncScheduler scheduler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore, T1, T2, T3, T4, T5, T6>(h => h, addHandler, removeHandler, scheduler); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore(conversion, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore(conversion, addHandler, removeHandler, scheduler); } private static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6)> FromEventCore(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { return SynchronizeEvents( Create<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6)>(observer => { var handler = new Action((arg1, arg2, arg3, arg4, arg5, arg6) => { observer.OnNextAsync((arg1, arg2, arg3, arg4, arg5, arg6)); // REVIEW: Fire-and-forget can lead to out of order processing, and observers may reject these calls as "busy". }); var converted = conversion(handler); addHandler(converted); return new ValueTask(AsyncDisposable.Create(() => { removeHandler(converted); return default; })); }), scheduler ); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7)> FromEvent(Action> addHandler, Action> removeHandler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore, T1, T2, T3, T4, T5, T6, T7>(h => h, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7)> FromEvent(Action> addHandler, Action> removeHandler, IAsyncScheduler scheduler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore, T1, T2, T3, T4, T5, T6, T7>(h => h, addHandler, removeHandler, scheduler); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore(conversion, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore(conversion, addHandler, removeHandler, scheduler); } private static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7)> FromEventCore(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { return SynchronizeEvents( Create<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7)>(observer => { var handler = new Action((arg1, arg2, arg3, arg4, arg5, arg6, arg7) => { observer.OnNextAsync((arg1, arg2, arg3, arg4, arg5, arg6, arg7)); // REVIEW: Fire-and-forget can lead to out of order processing, and observers may reject these calls as "busy". }); var converted = conversion(handler); addHandler(converted); return new ValueTask(AsyncDisposable.Create(() => { removeHandler(converted); return default; })); }), scheduler ); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8)> FromEvent(Action> addHandler, Action> removeHandler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore, T1, T2, T3, T4, T5, T6, T7, T8>(h => h, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8)> FromEvent(Action> addHandler, Action> removeHandler, IAsyncScheduler scheduler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore, T1, T2, T3, T4, T5, T6, T7, T8>(h => h, addHandler, removeHandler, scheduler); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore(conversion, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore(conversion, addHandler, removeHandler, scheduler); } private static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8)> FromEventCore(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { return SynchronizeEvents( Create<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8)>(observer => { var handler = new Action((arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) => { observer.OnNextAsync((arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)); // REVIEW: Fire-and-forget can lead to out of order processing, and observers may reject these calls as "busy". }); var converted = conversion(handler); addHandler(converted); return new ValueTask(AsyncDisposable.Create(() => { removeHandler(converted); return default; })); }), scheduler ); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9)> FromEvent(Action> addHandler, Action> removeHandler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore, T1, T2, T3, T4, T5, T6, T7, T8, T9>(h => h, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9)> FromEvent(Action> addHandler, Action> removeHandler, IAsyncScheduler scheduler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore, T1, T2, T3, T4, T5, T6, T7, T8, T9>(h => h, addHandler, removeHandler, scheduler); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore(conversion, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore(conversion, addHandler, removeHandler, scheduler); } private static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9)> FromEventCore(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { return SynchronizeEvents( Create<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9)>(observer => { var handler = new Action((arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) => { observer.OnNextAsync((arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)); // REVIEW: Fire-and-forget can lead to out of order processing, and observers may reject these calls as "busy". }); var converted = conversion(handler); addHandler(converted); return new ValueTask(AsyncDisposable.Create(() => { removeHandler(converted); return default; })); }), scheduler ); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10)> FromEvent(Action> addHandler, Action> removeHandler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(h => h, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10)> FromEvent(Action> addHandler, Action> removeHandler, IAsyncScheduler scheduler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(h => h, addHandler, removeHandler, scheduler); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore(conversion, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore(conversion, addHandler, removeHandler, scheduler); } private static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10)> FromEventCore(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { return SynchronizeEvents( Create<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10)>(observer => { var handler = new Action((arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) => { observer.OnNextAsync((arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10)); // REVIEW: Fire-and-forget can lead to out of order processing, and observers may reject these calls as "busy". }); var converted = conversion(handler); addHandler(converted); return new ValueTask(AsyncDisposable.Create(() => { removeHandler(converted); return default; })); }), scheduler ); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11)> FromEvent(Action> addHandler, Action> removeHandler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(h => h, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11)> FromEvent(Action> addHandler, Action> removeHandler, IAsyncScheduler scheduler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(h => h, addHandler, removeHandler, scheduler); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore(conversion, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore(conversion, addHandler, removeHandler, scheduler); } private static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11)> FromEventCore(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { return SynchronizeEvents( Create<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11)>(observer => { var handler = new Action((arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11) => { observer.OnNextAsync((arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11)); // REVIEW: Fire-and-forget can lead to out of order processing, and observers may reject these calls as "busy". }); var converted = conversion(handler); addHandler(converted); return new ValueTask(AsyncDisposable.Create(() => { removeHandler(converted); return default; })); }), scheduler ); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12)> FromEvent(Action> addHandler, Action> removeHandler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(h => h, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12)> FromEvent(Action> addHandler, Action> removeHandler, IAsyncScheduler scheduler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(h => h, addHandler, removeHandler, scheduler); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore(conversion, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore(conversion, addHandler, removeHandler, scheduler); } private static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12)> FromEventCore(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { return SynchronizeEvents( Create<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12)>(observer => { var handler = new Action((arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12) => { observer.OnNextAsync((arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12)); // REVIEW: Fire-and-forget can lead to out of order processing, and observers may reject these calls as "busy". }); var converted = conversion(handler); addHandler(converted); return new ValueTask(AsyncDisposable.Create(() => { removeHandler(converted); return default; })); }), scheduler ); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13)> FromEvent(Action> addHandler, Action> removeHandler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(h => h, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13)> FromEvent(Action> addHandler, Action> removeHandler, IAsyncScheduler scheduler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(h => h, addHandler, removeHandler, scheduler); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore(conversion, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore(conversion, addHandler, removeHandler, scheduler); } private static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13)> FromEventCore(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { return SynchronizeEvents( Create<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13)>(observer => { var handler = new Action((arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13) => { observer.OnNextAsync((arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13)); // REVIEW: Fire-and-forget can lead to out of order processing, and observers may reject these calls as "busy". }); var converted = conversion(handler); addHandler(converted); return new ValueTask(AsyncDisposable.Create(() => { removeHandler(converted); return default; })); }), scheduler ); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14)> FromEvent(Action> addHandler, Action> removeHandler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(h => h, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14)> FromEvent(Action> addHandler, Action> removeHandler, IAsyncScheduler scheduler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(h => h, addHandler, removeHandler, scheduler); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore(conversion, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore(conversion, addHandler, removeHandler, scheduler); } private static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14)> FromEventCore(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { return SynchronizeEvents( Create<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14)>(observer => { var handler = new Action((arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14) => { observer.OnNextAsync((arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14)); // REVIEW: Fire-and-forget can lead to out of order processing, and observers may reject these calls as "busy". }); var converted = conversion(handler); addHandler(converted); return new ValueTask(AsyncDisposable.Create(() => { removeHandler(converted); return default; })); }), scheduler ); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15)> FromEvent(Action> addHandler, Action> removeHandler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(h => h, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15)> FromEvent(Action> addHandler, Action> removeHandler, IAsyncScheduler scheduler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(h => h, addHandler, removeHandler, scheduler); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore(conversion, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore(conversion, addHandler, removeHandler, scheduler); } private static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15)> FromEventCore(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { return SynchronizeEvents( Create<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15)>(observer => { var handler = new Action((arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15) => { observer.OnNextAsync((arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)); // REVIEW: Fire-and-forget can lead to out of order processing, and observers may reject these calls as "busy". }); var converted = conversion(handler); addHandler(converted); return new ValueTask(AsyncDisposable.Create(() => { removeHandler(converted); return default; })); }), scheduler ); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16)> FromEvent(Action> addHandler, Action> removeHandler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>(h => h, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16)> FromEvent(Action> addHandler, Action> removeHandler, IAsyncScheduler scheduler) { if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>(h => h, addHandler, removeHandler, scheduler); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); return FromEventCore(conversion, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16)> FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { if (conversion == null) throw new ArgumentNullException(nameof(conversion)); if (addHandler == null) throw new ArgumentNullException(nameof(addHandler)); if (removeHandler == null) throw new ArgumentNullException(nameof(removeHandler)); if (scheduler == null) throw new ArgumentNullException(nameof(scheduler)); return FromEventCore(conversion, addHandler, removeHandler, scheduler); } private static IAsyncObservable<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16)> FromEventCore(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IAsyncScheduler scheduler) { return SynchronizeEvents( Create<(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16)>(observer => { var handler = new Action((arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16) => { observer.OnNextAsync((arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16)); // REVIEW: Fire-and-forget can lead to out of order processing, and observers may reject these calls as "busy". }); var converted = conversion(handler); addHandler(converted); return new ValueTask(AsyncDisposable.Create(() => { removeHandler(converted); return default; })); }), scheduler ); } } }