feat: one time listeners for events added

This commit is contained in:
Syntriax 2025-06-03 11:43:46 +03:00
parent 8d49fb467c
commit 9edf3b0aa6

View File

@ -5,11 +5,14 @@ namespace Syntriax.Engine.Core;
public class Event public class Event
{ {
private readonly List<EventHandler> listeners = new(8); private readonly List<EventHandler> listeners = new(4);
private readonly List<EventHandler> onceListeners = new(2);
public void AddListener(EventHandler listener) => listeners.Add(listener); 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 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() public void Invoke()
{ {
for (int i = 0; i < listeners.Count; i++) 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}()"; string methodCallRepresentation = $"{listeners[i].Method.DeclaringType?.FullName}.{listeners[i].Method.Name}()";
Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}"); 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 delegate void EventHandler();
@ -26,20 +40,34 @@ public class Event
public class Event<TSender> public class Event<TSender>
{ {
private readonly List<EventHandler> listeners = new(8); private readonly List<EventHandler> listeners = new(4);
private readonly List<EventHandler> onceListeners = new(2);
public void AddListener(EventHandler listener) => listeners.Add(listener); 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 RemoveListener(EventHandler listener) => listeners.Remove(listener);
public void Clear() => listeners.Clear(); public void RemoveOnceListener(EventHandler listener) => onceListeners.Remove(listener);
public void Invoke(TSender argument) public void Clear() { listeners.Clear(); onceListeners.Clear(); }
public void Invoke(TSender sender)
{ {
for (int i = 0; i < listeners.Count; i++) for (int i = 0; i < listeners.Count; i++)
try { listeners[i].Invoke(argument); } try { listeners[i].Invoke(sender); }
catch (Exception exception) 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}"); 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 delegate void EventHandler(TSender sender);
@ -47,11 +75,14 @@ public class Event<TSender>
public class Event<TSender, TArguments> public class Event<TSender, TArguments>
{ {
private readonly List<EventHandler> listeners = new(8); private readonly List<EventHandler> listeners = new(4);
private readonly List<EventHandler> onceListeners = new(2);
public void AddListener(EventHandler listener) => listeners.Add(listener); 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 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) public void Invoke(TSender sender, TArguments args)
{ {
for (int i = 0; i < listeners.Count; i++) for (int i = 0; i < listeners.Count; i++)
@ -61,6 +92,17 @@ public class Event<TSender, TArguments>
string methodCallRepresentation = $"{listeners[i].Method.DeclaringType?.FullName}.{listeners[i].Method.Name}({string.Join(", ", sender, args)})"; 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}"); 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); public delegate void EventHandler(TSender sender, TArguments args);