|
- using System;
- using System.Collections.Generic;
- using System.Collections.Immutable;
- using System.Threading.Tasks;
-
- namespace Discord
- {
- internal class AsyncEvent<T>
- where T : class
- {
- private readonly object _subLock = new object();
- internal ImmutableArray<T> _subscriptions;
-
- public bool HasSubscribers => _subscriptions.Length != 0;
- public IReadOnlyList<T> Subscriptions => _subscriptions;
-
- public AsyncEvent()
- {
- _subscriptions = ImmutableArray.Create<T>();
- }
-
- public void Add(T subscriber)
- {
- Preconditions.NotNull(subscriber, nameof(subscriber));
- lock (_subLock)
- _subscriptions = _subscriptions.Add(subscriber);
- }
- public void Remove(T subscriber)
- {
- Preconditions.NotNull(subscriber, nameof(subscriber));
- lock (_subLock)
- _subscriptions = _subscriptions.Remove(subscriber);
- }
- }
-
- internal static class EventExtensions
- {
- public static async Task InvokeAsync(this AsyncEvent<Func<Task>> eventHandler)
- {
- var subscribers = eventHandler.Subscriptions;
- for (int i = 0; i < subscribers.Count; i++)
- await subscribers[i].Invoke().ConfigureAwait(false);
- }
- public static async Task InvokeAsync<T>(this AsyncEvent<Func<T, Task>> eventHandler, T arg)
- {
- var subscribers = eventHandler.Subscriptions;
- for (int i = 0; i < subscribers.Count; i++)
- await subscribers[i].Invoke(arg).ConfigureAwait(false);
- }
- public static async Task InvokeAsync<T1, T2>(this AsyncEvent<Func<T1, T2, Task>> eventHandler, T1 arg1, T2 arg2)
- {
- var subscribers = eventHandler.Subscriptions;
- for (int i = 0; i < subscribers.Count; i++)
- await subscribers[i].Invoke(arg1, arg2).ConfigureAwait(false);
- }
- public static async Task InvokeAsync<T1, T2, T3>(this AsyncEvent<Func<T1, T2, T3, Task>> eventHandler, T1 arg1, T2 arg2, T3 arg3)
- {
- var subscribers = eventHandler.Subscriptions;
- for (int i = 0; i < subscribers.Count; i++)
- await subscribers[i].Invoke(arg1, arg2, arg3).ConfigureAwait(false);
- }
- public static async Task InvokeAsync<T1, T2, T3, T4>(this AsyncEvent<Func<T1, T2, T3, T4, Task>> eventHandler, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
- {
- var subscribers = eventHandler.Subscriptions;
- for (int i = 0; i < subscribers.Count; i++)
- await subscribers[i].Invoke(arg1, arg2, arg3, arg4).ConfigureAwait(false);
- }
- public static async Task InvokeAsync<T1, T2, T3, T4, T5>(this AsyncEvent<Func<T1, T2, T3, T4, T5, Task>> eventHandler, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5)
- {
- var subscribers = eventHandler.Subscriptions;
- for (int i = 0; i < subscribers.Count; i++)
- await subscribers[i].Invoke(arg1, arg2, arg3, arg4, arg5).ConfigureAwait(false);
- }
- }
- }
|