Initial commit

implemented the game of life variation with hexagonal grid
This commit is contained in:
2025-12-16 11:33:00 +00:00
commit ea5b5c4e75
17 changed files with 1229 additions and 0 deletions

58
ui/event_bus.go Normal file
View File

@@ -0,0 +1,58 @@
package ui
import (
"fmt"
"sync"
"github.com/nmoniz/gubgub"
)
var eventBusGetter = sync.OnceValue(func() *eventBus {
return NewSyncEventBus()
})
func EventBus() *eventBus {
return eventBusGetter()
}
type Event interface {
Name() string
Data() any
}
type eventBus struct {
topics map[string]gubgub.Topic[Event]
}
func NewSyncEventBus() *eventBus {
return &eventBus{
topics: make(map[string]gubgub.Topic[Event]),
}
}
func (eb *eventBus) Emit(e Event) error {
topic, ok := eb.topics[e.Name()]
if !ok {
return nil
}
err := topic.Publish(e)
if err != nil {
return fmt.Errorf("emit event: %w", err)
}
return nil
}
func (eb *eventBus) Listen(name string, handler func(Event)) error {
topic, ok := eb.topics[name]
if !ok {
topic = gubgub.NewSyncTopic[Event]()
eb.topics[name] = topic
}
err := topic.Subscribe(gubgub.Forever(handler))
if err != nil {
return fmt.Errorf("listen for event: %w", err)
}
return nil
}