using Cysharp.Threading.Tasks; using PMaker.Messaging; using System.Threading; using UnityEngine; public class MessageBridge { public struct Message { public Message(TRoute route, DomainStructEvents.MessageDelegate handle) { this._route = route; this._handle = handle; } private TRoute _route; private DomainStructEvents.MessageDelegate _handle; public async void AddTo(CancellationToken token) { await token.WaitUntilCanceled(); DomainStructEvents.Unsubscribe(_route, _handle); } public async void AddTo(Component component) { var token = component.GetCancellationTokenOnDestroy(); await token.WaitUntilCanceled(); DomainStructEvents.Unsubscribe(_route, _handle); } } public static Message Subscribe(TRoute route, DomainStructEvents.MessageDelegate handle, CancellationToken token = default) { DomainStructEvents.Subscribe(route, handle); return new Message(route, handle); } } public class ClssOnlyMessageBridge where TMessage : class where TRoute : class { public struct ClessOnlyMessage { public ClessOnlyMessage(TRoute route, DomainEvents.MessageDelegate handle) { this._route = route; this._handle = handle; } private TRoute _route; private DomainEvents.MessageDelegate _handle; public async void AddTo(CancellationToken token) { await token.WaitUntilCanceled(); DomainEvents.Unsubscribe(_route, _handle); } public async void AddTo(Component component) { var token = component.GetCancellationTokenOnDestroy(); await token.WaitUntilCanceled(); DomainEvents.Unsubscribe(_route, _handle); } } public static ClessOnlyMessage Subscribe(TRoute route, DomainEvents.MessageDelegate handle, CancellationToken token = default) { DomainEvents.Subscribe(route, handle); return new ClessOnlyMessage(route, handle); } }