1
0
Fork 0
LaboratoryProtection/Assets/PMaker/Scripts/Messaging/MessageBridge.cs

75 lines
2.3 KiB
C#
Raw Normal View History

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