diff --git a/Engine.Core/Helpers/Event.cs b/Engine.Core/Helpers/Event.cs index 08a6e80..56fe54b 100644 --- a/Engine.Core/Helpers/Event.cs +++ b/Engine.Core/Helpers/Event.cs @@ -5,11 +5,14 @@ namespace Syntriax.Engine.Core; public class Event { - private readonly List listeners = new(8); + 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 Clear() => listeners.Clear(); + 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++) @@ -19,6 +22,17 @@ public class Event 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(); @@ -26,20 +40,34 @@ public class Event public class Event { - private readonly List listeners = new(8); + 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 Clear() => listeners.Clear(); - public void Invoke(TSender argument) + 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(argument); } + try { listeners[i].Invoke(sender); } catch (Exception exception) { - string methodCallRepresentation = $"{listeners[i].Method.DeclaringType?.FullName}.{listeners[i].Method.Name}({argument})"; + 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); @@ -47,11 +75,14 @@ public class Event public class Event { - private readonly List listeners = new(8); + 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 Clear() => listeners.Clear(); + 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++) @@ -61,6 +92,17 @@ public class Event 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);