diff --git a/Engine.Core/Helpers/Event.cs b/Engine.Core/Helpers/Event.cs index 66f2550..05573ae 100644 --- a/Engine.Core/Helpers/Event.cs +++ b/Engine.Core/Helpers/Event.cs @@ -3,16 +3,81 @@ using System.Collections.Generic; namespace Syntriax.Engine.Core; +/// +/// Represents a simple event with no parameters. +/// Example usage: +/// +/// public class MyBehaviour : Behaviour, IUpdate +/// { +/// public readonly Event MyEvent = new(); +/// +/// public MyBehaviour() +/// { +/// MyEvent.AddListener(OnEventTriggered); +/// MyEvent.AddOneTimeListener(OnEventTriggeredOneTime); +/// } +/// +/// public void Update() +/// { +/// MyEvent.Invoke(); +/// } +/// +/// private void OnEventTriggered() +/// { +/// Console.WriteLine($"Event occurred!"); +/// } +/// +/// private static void OnEventTriggeredOneTime() +/// { +/// Console.WriteLine($"Event called once!"); +/// } +/// } +/// +/// The output of the example code above would be: +/// +/// Event occurred! +/// Event called once! +/// Event occurred! +/// Event occurred! +/// Event occurred! +/// ... +/// +/// public class Event { private readonly List listeners = null!; private readonly List onceListeners = null!; + /// + /// Subscribes the callback to be invoked whenever the event is triggered. + /// + /// The callback to be called when the event is triggered. public void AddListener(EventHandler listener) => listeners.Add(listener); + /// + /// Subscribes the callback to be invoked the next time the event is triggered. The callback will be called only once. + /// + /// The callback to be called the next time the event is triggered. public void AddOneTimeListener(EventHandler listener) => onceListeners.Add(listener); + + /// + /// Unsubscribes the callback that was previously registered by . + /// + /// The callback that was previously registered by public void RemoveListener(EventHandler listener) => listeners.Remove(listener); + /// + /// Unsubscribes the callback that was previously registered by . + /// + /// The callback that was previously registered by public void RemoveOneTimeListener(EventHandler listener) => onceListeners.Remove(listener); + + /// + /// Unsubscribes all listeners that was previously registered by either or . + /// public void Clear() { listeners.Clear(); onceListeners.Clear(); } + + /// + /// Triggers the event. + /// public void Invoke() { for (int i = 0; i < listeners.Count; i++) @@ -50,16 +115,84 @@ public class Event public delegate void EventHandler(); } +/// +/// Represents an event with only sender parameters. +/// Example usage: +/// +/// public class MyBehaviour : Behaviour, IUpdate +/// { +/// public readonly Event<MyBehaviour> MyEvent = new(); +/// +/// public MyBehaviour() +/// { +/// MyEvent.AddListener(OnEventTriggered); +/// MyEvent.AddOneTimeListener(OnEventTriggeredOneTime); +/// } +/// +/// public void Update() +/// { +/// MyEvent.Invoke(this); +/// } +/// +/// private void OnEventTriggered(MyBehaviour sender) +/// { +/// Console.WriteLine($"{sender.Id}'s event occurred!"); +/// } +/// +/// private static void OnEventTriggeredOneTime(MyBehaviour sender) +/// { +/// Console.WriteLine($"{sender.Id}'s event called once!"); +/// } +/// } +/// +/// The output of the example code above would be: +/// +/// [Id]'s event occurred! +/// [Id]'s event called once! +/// [Id]'s event occurred! +/// [Id]'s event occurred! +/// [Id]'s event occurred! +/// ... +/// +/// +/// +/// Sender type public class Event { private readonly List listeners = null!; private readonly List onceListeners = null!; + /// + /// Subscribes the callback to be invoked whenever the event is triggered. + /// + /// The callback to be called when the event is triggered. public void AddListener(EventHandler listener) => listeners.Add(listener); + /// + /// Subscribes the callback to be invoked the next time the event is triggered. The callback will be called only once. + /// + /// The callback to be called the next time the event is triggered. public void AddOneTimeListener(EventHandler listener) => onceListeners.Add(listener); + + /// + /// Unsubscribes the callback that was previously registered by . + /// + /// The callback that was previously registered by public void RemoveListener(EventHandler listener) => listeners.Remove(listener); + /// + /// Unsubscribes the callback that was previously registered by . + /// + /// The callback that was previously registered by public void RemoveOneTimeListener(EventHandler listener) => onceListeners.Remove(listener); + + /// + /// Unsubscribes all listeners that was previously registered by either or . + /// public void Clear() { listeners.Clear(); onceListeners.Clear(); } + + /// + /// Triggers the event. + /// + /// The caller that's triggering this event. public void Invoke(TSender sender) { for (int i = 0; i < listeners.Count; i++) @@ -97,16 +230,92 @@ public class Event public delegate void EventHandler(TSender sender); } +/// +/// Represents an event with sender and argument parameters. +/// Example usage: +/// +/// public class MyBehaviour : Behaviour, IUpdate +/// { +/// public readonly Event<MyBehaviour, MyArguments> MyEvent = new(); +/// +/// private int myInt = 0; +/// private bool myBool = false; +/// +/// public MyBehaviour() +/// { +/// MyEvent.AddOneTimeListener(OnEventTriggeredOneTime); +/// MyEvent.AddListener(OnEventTriggered); +/// } +/// +/// public void Update() +/// { +/// MyEvent.Invoke(this, new MyArguments(myInt, myBool)); +/// myInt++; +/// myBool = !myBool; +/// } +/// +/// private void OnEventTriggered(MyBehaviour sender, MyArguments args) +/// { +/// Console.WriteLine($"{sender.Id}'s event occurred with MyInt: {args.MyInt} and MyBool {args.MyBool}!"); +/// } +/// +/// private static void OnEventTriggeredOneTime(MyBehaviour sender, MyArguments args) +/// { +/// Console.WriteLine($"{sender.Id}'s event called once with MyInt: {args.MyInt} and MyBool {args.MyBool}!"); +/// } +/// +/// public readonly record struct MyArguments(int MyInt, bool MyBool); +/// } +/// +/// The output of the example code above would be: +/// +/// [Id]'s event occurred with MyInt: 0 and MyBool False! +/// [Id]'s event called once with MyInt: 0 and MyBool False! +/// [Id]'s event occurred with MyInt: 1 and MyBool True! +/// [Id]'s event occurred with MyInt: 2 and MyBool False! +/// [Id]'s event occurred with MyInt: 3 and MyBool True! +/// ... +/// +/// +/// +/// Sender type public class Event { private readonly List listeners = null!; private readonly List onceListeners = null!; + /// + /// Subscribes the callback to be invoked whenever the event is triggered. + /// + /// The callback to be called when the event is triggered. public void AddListener(EventHandler listener) => listeners.Add(listener); + /// + /// Subscribes the callback to be invoked the next time the event is triggered. The callback will be called only once. + /// + /// The callback to be called the next time the event is triggered. public void AddOneTimeListener(EventHandler listener) => onceListeners.Add(listener); + + /// + /// Unsubscribes the callback that was previously registered by . + /// + /// The callback that was previously registered by public void RemoveListener(EventHandler listener) => listeners.Remove(listener); + /// + /// Unsubscribes the callback that was previously registered by . + /// + /// The callback that was previously registered by public void RemoveOneTimeListener(EventHandler listener) => onceListeners.Remove(listener); + + /// + /// Unsubscribes all listeners that was previously registered by either or . + /// public void Clear() { listeners.Clear(); onceListeners.Clear(); } + + /// + /// Triggers the event. + /// + /// The caller that's triggering this event. + /// The arguments provided for this event. public void Invoke(TSender sender, TArguments args) { for (int i = 0; i < listeners.Count; i++)