104 lines
2.8 KiB
C#
104 lines
2.8 KiB
C#
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); });
|
|
}
|
|
}
|
|
} |