using System; using System.Collections.Generic; using UnityEngine.Events; namespace PMaker.Messaging { public static class DomainEvents where TMessage : class { public static event Action OnMessage; public static void Publish(TMessage message) { OnMessage(message); } public static void Subscribe(Action handler) { OnMessage += handler; } public static void Unsubscribe(Action handler) { OnMessage -= handler; } public static void Clear() { OnMessage = default; } } public static class DomainEvents where TMessage : class where TRoute : class { public delegate void MessageDelegate(TMessage message); static readonly Dictionary _listeners = new Dictionary(); 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 DomainEvents { public static void Publish(TMessage message) where TMessage : class { DomainEvents.Publish(message); } public static void Publish(TRoute route, TMessage message) where TMessage : class where TRoute : class { DomainEvents.Publish(route, message); } } public static class DomainEventsUnityEventExtension { public static void Binding(this UnityEvent unityEvent, TRoute route, TMessage message) where TRoute : class where TMessage : class { unityEvent.AddListener(() => { DomainEvents.Publish(route, message); }); } public static void Binding(this UnityEvent unityEvent, TMessage message) where TMessage : class { unityEvent.AddListener(() => { DomainEvents.Publish(message); }); } } }