diff --git a/addons/godot_state_charts/csharp/TypeSafeSignal.cs b/addons/godot_state_charts/csharp/TypeSafeSignal.cs new file mode 100644 index 0000000..81b1ffd --- /dev/null +++ b/addons/godot_state_charts/csharp/TypeSafeSignal.cs @@ -0,0 +1,83 @@ +using System; +using Godot; + +namespace GodotStateCharts; + +public class TypeSafeSignal +{ + private readonly Node _node; + private readonly StringName _signalName; + + public TypeSafeSignal(Node node, StringName signalName) + { + _node = node; + _signalName = signalName; + } + + public void Connect(TypeSafeReceiver receiver) + { + _node.Connect(_signalName, receiver.Callable); + } + + public void Disconnect(TypeSafeReceiver receiver) + { + _node.Disconnect(_signalName, receiver.Callable); + } +} + +public struct TypeSafeReceiver +{ + internal TypeSafeReceiver(Callable callable) + { + Callable = callable; + } + + public Callable Callable { get; } +} + +public static class TypeSafeExtensions +{ + public static void Connect(this TypeSafeSignal signal, Action action) + { + signal.Connect(new TypeSafeReceiver(Callable.From(action))); + } + + public static void Disconnect(this TypeSafeSignal signal, Action action) + { + signal.Disconnect(new TypeSafeReceiver(Callable.From(action))); + } + + public static void Connect(this TypeSafeSignal signal, Action action) + { + signal.Connect(new TypeSafeReceiver(Callable.From(action))); + } + + public static void Disconnect(this TypeSafeSignal signal, Action action) + { + signal.Disconnect(new TypeSafeReceiver(Callable.From(action))); + } + +// two args + + public static void Connect(this TypeSafeSignal> signal, Action action) + { + signal.Connect(new TypeSafeReceiver>(Callable.From(action))); + } + + public static void Disconnect(this TypeSafeSignal> signal, Action action) + { + signal.Disconnect(new TypeSafeReceiver>(Callable.From(action))); + } + +// three args + + public static void Connect(this TypeSafeSignal> signal, Action action) + { + signal.Connect(new TypeSafeReceiver>(Callable.From(action))); + } + + public static void Disconnect(this TypeSafeSignal> signal, Action action) + { + signal.Disconnect(new TypeSafeReceiver>(Callable.From(action))); + } +}