using MessagePipe.Internal; using System; using System.Threading; using Cysharp.Threading.Tasks; namespace MessagePipe { public static partial class SubscriberExtensions { // pubsub-keyless-sync public static IDisposable Subscribe(this ISubscriber subscriber, Action handler, params MessageHandlerFilter[] filters) { return subscriber.Subscribe(new AnonymousMessageHandler(handler), filters); } public static IDisposable Subscribe(this ISubscriber subscriber, Action handler, Func predicate, params MessageHandlerFilter[] filters) { var predicateFilter = new PredicateFilter(predicate); filters = (filters.Length == 0) ? new[] { predicateFilter } : ArrayUtil.ImmutableAdd(filters, predicateFilter); return subscriber.Subscribe(new AnonymousMessageHandler(handler), filters); } public static IDisposable Subscribe(this IBufferedSubscriber subscriber, Action handler, params MessageHandlerFilter[] filters) { return subscriber.Subscribe(new AnonymousMessageHandler(handler), filters); } public static IDisposable Subscribe(this IBufferedSubscriber subscriber, Action handler, Func predicate, params MessageHandlerFilter[] filters) { var predicateFilter = new PredicateFilter(predicate); filters = (filters.Length == 0) ? new[] { predicateFilter } : ArrayUtil.ImmutableAdd(filters, predicateFilter); return subscriber.Subscribe(new AnonymousMessageHandler(handler), filters); } // pubsub-keyless-async public static IDisposable Subscribe(this IAsyncSubscriber subscriber, Func handler, params AsyncMessageHandlerFilter[] filters) { return subscriber.Subscribe(new AnonymousAsyncMessageHandler(handler), filters); } public static IDisposable Subscribe(this IAsyncSubscriber subscriber, Func handler, Func predicate, params AsyncMessageHandlerFilter[] filters) { var predicateFilter = new AsyncPredicateFilter(predicate); filters = (filters.Length == 0) ? new[] { predicateFilter } : ArrayUtil.ImmutableAdd(filters, predicateFilter); return subscriber.Subscribe(new AnonymousAsyncMessageHandler(handler), filters); } public static UniTask SubscribeAsync(this IBufferedAsyncSubscriber subscriber, Func handler, CancellationToken cancellationToken = default) { return SubscribeAsync(subscriber, handler, Array.Empty>(), cancellationToken); } public static UniTask SubscribeAsync(this IBufferedAsyncSubscriber subscriber, Func handler, AsyncMessageHandlerFilter[] filters, CancellationToken cancellationToken = default) { return subscriber.SubscribeAsync(new AnonymousAsyncMessageHandler(handler), filters, cancellationToken); } public static UniTask SubscribeAsync(this IBufferedAsyncSubscriber subscriber, Func handler, Func predicate, CancellationToken cancellationToken = default) { return SubscribeAsync(subscriber, handler, predicate, Array.Empty>(), cancellationToken); } public static UniTask SubscribeAsync(this IBufferedAsyncSubscriber subscriber, Func handler, Func predicate, AsyncMessageHandlerFilter[] filters, CancellationToken cancellationToken = default) { var predicateFilter = new AsyncPredicateFilter(predicate); filters = (filters.Length == 0) ? new[] { predicateFilter } : ArrayUtil.ImmutableAdd(filters, predicateFilter); return subscriber.SubscribeAsync(new AnonymousAsyncMessageHandler(handler), filters, cancellationToken); } // pubsub-key-sync public static IDisposable Subscribe(this ISubscriber subscriber, TKey key, Action handler, params MessageHandlerFilter[] filters) { return subscriber.Subscribe(key, new AnonymousMessageHandler(handler), filters); } public static IDisposable Subscribe(this ISubscriber subscriber, TKey key, Action handler, Func predicate, params MessageHandlerFilter[] filters) { var predicateFilter = new PredicateFilter(predicate); filters = (filters.Length == 0) ? new[] { predicateFilter } : ArrayUtil.ImmutableAdd(filters, predicateFilter); return subscriber.Subscribe(key, new AnonymousMessageHandler(handler), filters); } // pubsub-key-async public static IDisposable Subscribe(this IAsyncSubscriber subscriber, TKey key, Func handler, params AsyncMessageHandlerFilter[] filters) { return subscriber.Subscribe(key, new AnonymousAsyncMessageHandler(handler), filters); } public static IDisposable Subscribe(this IAsyncSubscriber subscriber, TKey key, Func handler, Func predicate, params AsyncMessageHandlerFilter[] filters) { var predicateFilter = new AsyncPredicateFilter(predicate); filters = (filters.Length == 0) ? new[] { predicateFilter } : ArrayUtil.ImmutableAdd(filters, predicateFilter); return subscriber.Subscribe(key, new AnonymousAsyncMessageHandler(handler), filters); } } internal sealed class AnonymousMessageHandler : IMessageHandler { readonly Action handler; public AnonymousMessageHandler(Action handler) { this.handler = handler; } public void Handle(TMessage message) { handler.Invoke(message); } } internal sealed class AnonymousAsyncMessageHandler : IAsyncMessageHandler { readonly Func handler; public AnonymousAsyncMessageHandler(Func handler) { this.handler = handler; } public UniTask HandleAsync(TMessage message, CancellationToken cancellationToken) { return handler.Invoke(message, cancellationToken); } } }