Commit 43cd9d1

mo khan <mo@mokhan.ca>
2025-07-24 16:21:17
feat: publish to multiple subscribers
1 parent b864197
Changed files (2)
pkg/event/aggregator.go
@@ -1,23 +1,24 @@
 package event
 
-type Event string
+type Event any
 type Subscription func(any)
 
 type Aggregator struct {
-	subscriptions map[Event]Subscription
+	subscriptions map[Event][]Subscription
 }
 
 func New() *Aggregator {
 	return &Aggregator{
-		subscriptions: map[Event]Subscription{},
+		subscriptions: map[Event][]Subscription{},
 	}
 }
 
 func (a *Aggregator) Subscribe(event Event, f Subscription) {
-	a.subscriptions[event] = f
+	a.subscriptions[event] = append(a.subscriptions[event], f)
 }
 
 func (a *Aggregator) Publish(event Event, message any) {
-	subscription := a.subscriptions[event]
-	subscription(message)
+	for _, subscription := range a.subscriptions[event] {
+		subscription(message)
+	}
 }
pkg/event/aggregator_test.go
@@ -8,16 +8,45 @@ import (
 
 func TestEventAggregator(t *testing.T) {
 	t.Run("Publish", func(t *testing.T) {
-		events := New()
-		called := false
+		t.Run("without any subscribers", func(t *testing.T) {
+			events := New()
 
-		events.Subscribe("announcement", func(message any) {
-			called = true
-			assert.Equal(t, "Hello", message)
+			events.Publish("announcements.engineering", "Business, Business, Business... Numbers!")
 		})
 
-		events.Publish("announcement", "Hello")
+		t.Run("with a single subscriber", func(t *testing.T) {
+			events := New()
+			called := false
 
-		assert.True(t, called)
+			events.Subscribe("announcement", func(message any) {
+				called = true
+				assert.Equal(t, "Hello", message)
+			})
+
+			events.Publish("announcement", "Hello")
+
+			assert.True(t, called)
+		})
+
+		t.Run("with multiple subscribers", func(t *testing.T) {
+			events := New()
+			called := map[int]bool{}
+
+			events.Subscribe("announcement", func(message any) {
+				called[0] = true
+				assert.Equal(t, "Greetings", message)
+			})
+
+			events.Subscribe("announcement", func(message any) {
+				called[1] = true
+				assert.Equal(t, "Greetings", message)
+			})
+
+			events.Publish("announcement", "Greetings")
+
+			assert.Equal(t, 2, len(called))
+			assert.True(t, called[0])
+			assert.True(t, called[1])
+		})
 	})
 }