Skip to content

Commit 8cd7ec4

Browse files
committed
Big Update
1 parent b85ac1d commit 8cd7ec4

File tree

6 files changed

+46
-54
lines changed

6 files changed

+46
-54
lines changed

Runtime/Hub.cs

Lines changed: 28 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,43 +2,31 @@
22

33
namespace ToolBox.Signals
44
{
5-
public static class Hub
6-
{
7-
private static readonly Dictionary<int, List<IReceiver>> _signalToReceivers = new Dictionary<int, List<IReceiver>>(16);
8-
9-
public static void Dispatch<T>(in T value)
10-
{
11-
int hash = typeof(T).GetHashCode();
12-
13-
if (!_signalToReceivers.TryGetValue(hash, out var receivers))
14-
return;
15-
16-
int count = receivers.Count;
17-
18-
for (int i = count - 1; i >= 0; i--)
19-
(receivers[i] as IReceiver<T>).Receive(in value);
20-
}
21-
22-
public static void Add<T>(IReceiver<T> receiver)
23-
{
24-
int hash = typeof(T).GetHashCode();
25-
26-
if (_signalToReceivers.TryGetValue(hash, out var receivers) && !receivers.Contains(receiver))
27-
{
28-
receivers.Add(receiver);
29-
30-
return;
31-
}
32-
33-
_signalToReceivers.Add(hash, new List<IReceiver> { receiver });
34-
}
35-
36-
public static void Remove<T>(IReceiver<T> receiver)
37-
{
38-
int hash = typeof(T).GetHashCode();
39-
40-
if (_signalToReceivers.TryGetValue(hash, out var receivers) && receivers.Contains(receiver))
41-
receivers.Remove(receiver);
42-
}
43-
}
44-
}
5+
public static class Hub<S> where S : struct, ISignal
6+
{
7+
private static readonly List<IReceiver<S>> _receivers = new List<IReceiver<S>>(8);
8+
9+
public static S Last { get; private set; } = default;
10+
11+
public static void Add(IReceiver<S> receiver)
12+
{
13+
if (!_receivers.Contains(receiver))
14+
_receivers.Add(receiver);
15+
}
16+
17+
public static void Remove(IReceiver<S> receiver)
18+
{
19+
if (_receivers.Contains(receiver))
20+
_receivers.Remove(receiver);
21+
}
22+
23+
public static void Dispatch(in S value)
24+
{
25+
Last = value;
26+
int count = _receivers.Count - 1;
27+
28+
for (int i = count; i >= 0; i--)
29+
_receivers[i].Receive(in value);
30+
}
31+
}
32+
}

Runtime/IReceiver.cs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
namespace ToolBox.Signals
22
{
3-
public interface IReceiver { }
4-
5-
public interface IReceiver<T> : IReceiver
6-
{
7-
void Receive(in T value);
8-
}
9-
}
10-
3+
public interface IReceiver<S> where S : struct, ISignal
4+
{
5+
void Receive(in S value);
6+
}
7+
}

Runtime/ISignal.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
namespace ToolBox.Signals
2+
{
3+
public interface ISignal { }
4+
}

Runtime/ISignal.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Runtime/Listener.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@
33

44
namespace ToolBox.Signals
55
{
6-
public abstract class Listener<T> : MonoBehaviour, IReceiver<T>
6+
public abstract class Listener<S> : MonoBehaviour, IReceiver<S> where S : struct, ISignal
77
{
8-
[SerializeField] private UnityEvent<T> _onDispatched = null;
8+
[SerializeField] private UnityEvent<S> _onDispatched = null;
99

1010
private void OnEnable() =>
11-
Hub.Add(this);
11+
Hub<S>.Add(this);
1212

1313
private void OnDisable() =>
14-
Hub.Remove(this);
14+
Hub<S>.Remove(this);
1515

16-
public void Receive(in T value) =>
16+
public void Receive(in S value) =>
1717
_onDispatched?.Invoke(value);
1818
}
1919
}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "com.intothedev.signals",
3-
"version": "1.1.0",
3+
"version": "1.2.0",
44
"displayName": "Signals",
55
"description": "Lightweight type-safe messaging system.",
66
"author": {

0 commit comments

Comments
 (0)