Skip to content

Commit

Permalink
fixes yohamta#102
Browse files Browse the repository at this point in the history
  • Loading branch information
joelschutz committed Apr 21, 2023
1 parent cd6a0a4 commit ea53d32
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 27 deletions.
50 changes: 23 additions & 27 deletions features/events/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,42 +62,31 @@ func NewEventType[T any]() *EventType[T] {

// Subscribe registers a subscriber for the event.
func (e *EventType[T]) Subscribe(w donburi.World, subscriber Subscriber[T]) {
if e.eventBusQuery.Count(w) == 0 {
entity := w.Entry(w.Create(e.eventBus, eventType))
donburi.Set(entity, e.eventBus, newEventBusData[T]())
donburi.SetValue(entity, eventType, eventTypeData{
eventName: e.eventName,
process: func(w donburi.World) {
e.ProcessEvents(w)
},
})
}

eventBus := e.mustFindEventBus(w)
eventBus.subscribers = append(eventBus.subscribers, subscriber)
}

// Find the index of a subscriber
func (e *EventType[T]) findSubscriber(w donburi.World, subscriber Subscriber[T]) (int, bool) {
if e.eventBusQuery.Count(w) != 0 {
eventBus := e.mustFindEventBus(w)
for i, s := range eventBus.subscribers {
if reflect.ValueOf(s).Pointer() == reflect.ValueOf(subscriber).Pointer() {
return i, true
}
}
}
return 0, false
if e.eventBusQuery.Count(w) != 0 {
eventBus := e.mustFindEventBus(w)
for i, s := range eventBus.subscribers {
if reflect.ValueOf(s).Pointer() == reflect.ValueOf(subscriber).Pointer() {
return i, true
}
}
}
return 0, false
}

// Unsubscribe removes a subscriber for the event.
func (e *EventType[T]) Unsubscribe(w donburi.World, subscriber Subscriber[T]) {
index, found := e.findSubscriber(w, subscriber)
if found {
eventBus := e.mustFindEventBus(w)
eventBus.subscribers[index] = eventBus.subscribers[len(eventBus.subscribers)-1]
eventBus.subscribers = eventBus.subscribers[:len(eventBus.subscribers)-1]
}
index, found := e.findSubscriber(w, subscriber)
if found {
eventBus := e.mustFindEventBus(w)
eventBus.subscribers[index] = eventBus.subscribers[len(eventBus.subscribers)-1]
eventBus.subscribers = eventBus.subscribers[:len(eventBus.subscribers)-1]
}
}

// Publish publishes an event.
Expand Down Expand Up @@ -131,7 +120,14 @@ func (e *EventType[T]) ProcessEvents(w donburi.World) {
func (e *EventType[T]) mustFindEventBus(w donburi.World) *eventBusData[T] {
eventBus, ok := e.eventBusQuery.First(w)
if !ok {
panic("event bus not found")
eventBus = w.Entry(w.Create(e.eventBus, eventType))
donburi.Set(eventBus, e.eventBus, newEventBusData[T]())
donburi.SetValue(eventBus, eventType, eventTypeData{
eventName: e.eventName,
process: func(w donburi.World) {
e.ProcessEvents(w)
},
})
}
return donburi.Get[eventBusData[T]](eventBus, e.eventBus)
}
Expand Down
15 changes: 15 additions & 0 deletions features/events/example_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,21 @@ func TestUnsubscribe(t *testing.T) {
}
}

func TestEventsWithNoSubscribers(t *testing.T) {

w := donburi.NewWorld()

EnemyKilledEvent.Publish(w, &EnemyKilled{EnemyID: 1})

events.ProcessAllEvents(w)

ev := lastReceivedEvent

if ev != nil {
t.Errorf("event should not be received")
}
}

var (
lastReceivedEvent *EnemyKilled = nil
)
Expand Down

0 comments on commit ea53d32

Please sign in to comment.