using System; using System.Collections.Generic; namespace Syntriax.Engine.Core; public class Event { private readonly List listeners = new(4); private readonly List onceListeners = new(2); public void AddListener(EventHandler listener) => listeners.Add(listener); public void AddOnceListener(EventHandler listener) => onceListeners.Add(listener); public void RemoveListener(EventHandler listener) => listeners.Remove(listener); public void RemoveOnceListener(EventHandler listener) => onceListeners.Remove(listener); public void Clear() { listeners.Clear(); onceListeners.Clear(); } public void Invoke() { for (int i = 0; i < listeners.Count; i++) try { listeners[i].Invoke(); } catch (Exception exception) { string methodCallRepresentation = $"{listeners[i].Method.DeclaringType?.FullName}.{listeners[i].Method.Name}()"; Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}"); } for (int i = onceListeners.Count - 1; i >= 0; i--) { try { onceListeners[i].Invoke(); } catch (Exception exception) { string methodCallRepresentation = $"{onceListeners[i].Method.DeclaringType?.FullName}.{onceListeners[i].Method.Name}()"; Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}"); } onceListeners.RemoveAt(i); } } public delegate void EventHandler(); } public class Event { private readonly List listeners = new(4); private readonly List onceListeners = new(2); public void AddListener(EventHandler listener) => listeners.Add(listener); public void AddOnceListener(EventHandler listener) => onceListeners.Add(listener); public void RemoveListener(EventHandler listener) => listeners.Remove(listener); public void RemoveOnceListener(EventHandler listener) => onceListeners.Remove(listener); public void Clear() { listeners.Clear(); onceListeners.Clear(); } public void Invoke(TSender sender) { for (int i = 0; i < listeners.Count; i++) try { listeners[i].Invoke(sender); } catch (Exception exception) { string methodCallRepresentation = $"{listeners[i].Method.DeclaringType?.FullName}.{listeners[i].Method.Name}({sender})"; Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}"); } for (int i = onceListeners.Count - 1; i >= 0; i--) { try { onceListeners[i].Invoke(sender); } catch (Exception exception) { string methodCallRepresentation = $"{onceListeners[i].Method.DeclaringType?.FullName}.{onceListeners[i].Method.Name}({sender})"; Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}"); } onceListeners.RemoveAt(i); } } public delegate void EventHandler(TSender sender); } public class Event { private readonly List listeners = new(4); private readonly List onceListeners = new(2); public void AddListener(EventHandler listener) => listeners.Add(listener); public void AddOnceListener(EventHandler listener) => onceListeners.Add(listener); public void RemoveListener(EventHandler listener) => listeners.Remove(listener); public void RemoveOnceListener(EventHandler listener) => onceListeners.Remove(listener); public void Clear() { listeners.Clear(); onceListeners.Clear(); } public void Invoke(TSender sender, TArguments args) { for (int i = 0; i < listeners.Count; i++) try { listeners[i].Invoke(sender, args); } catch (Exception exception) { string methodCallRepresentation = $"{listeners[i].Method.DeclaringType?.FullName}.{listeners[i].Method.Name}({string.Join(", ", sender, args)})"; Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}"); } for (int i = onceListeners.Count - 1; i >= 0; i--) { try { onceListeners[i].Invoke(sender, args); } catch (Exception exception) { string methodCallRepresentation = $"{onceListeners[i].Method.DeclaringType?.FullName}.{onceListeners[i].Method.Name}({string.Join(", ", sender, args)})"; Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}"); } onceListeners.RemoveAt(i); } } public delegate void EventHandler(TSender sender, TArguments args); }