package event const ( namedPrefixer = ":" ) // Emitter able to emit events type Emitter interface { Emit(Event) } // Receiver able to listen to events type Receiver interface { On(name string, handler HandlerFunc) } // HandlerFunc func type HandlerFunc func(Event) // Event specific interface type Event interface { Name() string Data() interface{} } // private data type event struct { name string data interface{} } // New Event func New(name string, data interface{}) Event { return &event{name, data} } func (e *event) Name() string { return e.name } func (e *event) Data() interface{} { return e.data } // Prefixer // NamedEmitter data for event prefixer type NamedEmitter struct { name string bus Bus } // NewNamedEmitter creates a new emitter pointing to bus func NewNamedEmitter(name string, bus Bus) Emitter { return &NamedEmitter{name, bus} } // Emit will prefix with namedemitter name and push to bus func (ne *NamedEmitter) Emit(evt Event) { newEvt := &event{name: ne.name + namedPrefixer + evt.Name(), data: evt.Data()} ne.bus.Emit(newEvt) }