feat: one time listeners for events added
This commit is contained in:
parent
8d49fb467c
commit
9edf3b0aa6
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user