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

104 lines
2.8 KiB
C#
Raw Normal View History

2023-09-12 15:55:51 +08:00
using System;
using System.Collections.Generic;
using UnityEngine.Events;
namespace PMaker.Messaging
{
public static class DomainStructEvents<TMessage>
{
public static event Action<TMessage> OnMessage;
public static void Publish(TMessage message)
{
OnMessage(message);
}
public static void Subscribe(Action<TMessage> handler)
{
OnMessage += handler;
}
public static void Unsubscribe(Action<TMessage> handler)
{
OnMessage -= handler;
}
public static void Clear()
{
OnMessage = default;
}
}
public static class DomainStructEvents<TRoute, TMessage>
{
public delegate void MessageDelegate(TMessage message);
static readonly Dictionary<TRoute, MessageDelegate> _listeners = new Dictionary<TRoute, MessageDelegate>();
public static void Publish(TRoute route, TMessage message)
{
if (_listeners.TryGetValue(route, out var handle) == true)
{
handle?.Invoke(message);
}
}
public static void Subscribe(TRoute route, MessageDelegate handler)
{
if (!_listeners.ContainsKey(route))
{
_listeners.Add(route, default);
}
_listeners[route] += handler;
}
public static void Unsubscribe(TRoute route, MessageDelegate handler)
{
if (_listeners.ContainsKey(route))
{
_listeners[route] -= handler;
}
}
public static void Unsubscribe(TRoute route)
{
if (_listeners.ContainsKey(route))
{
_listeners.Remove(route);
}
}
public static void Clear()
{
_listeners.Clear();
}
}
public static class DomainStructEvents
{
public static void Publish<TMessage>(TMessage message)
{
DomainStructEvents<TMessage>.Publish(message);
}
public static void Publish<TRoute, TMessage>(TRoute route, TMessage message)
where TRoute : class
{
DomainStructEvents<TRoute, TMessage>.Publish(route, message);
}
}
public static class DomainStructEventsUnityEventExtension
{
public static void Binding<TRoute, TMessage>(this UnityEvent unityEvent, TRoute route, TMessage message)
{
unityEvent.AddListener(() => { DomainStructEvents<TRoute, TMessage>.Publish(route, message); });
}
public static void Binding<TMessage>(this UnityEvent unityEvent, TMessage message)
{
unityEvent.AddListener(() => { DomainStructEvents<TMessage>.Publish(message); });
}
}
}