Skip to content

Instantly share code, notes, and snippets.

@mcihad
Created November 20, 2022 19:27
Show Gist options
  • Save mcihad/acf2c357784defcff1cda176241ebb44 to your computer and use it in GitHub Desktop.
Save mcihad/acf2c357784defcff1cda176241ebb44 to your computer and use it in GitHub Desktop.
Golang EventEmitter
package main
import "fmt"
type EventFunc = func(i interface{})
type Event struct {
Funcs []EventFunc
Once bool
CallCounter int
}
type EventEmitter struct {
Events map[string]Event
}
func (e *EventEmitter) AddEventListener(eventName string, event EventFunc, once bool) {
found := false
if e.Events == nil {
e.Events = make(map[string]Event)
}
for name, _ := range e.Events {
if name == eventName {
found = true
//evt.Funcs = append(evt.Funcs, event)
if entry, ok := e.Events[name]; ok {
entry.Funcs = append(entry.Funcs, event)
e.Events[name] = entry
}
}
}
if !found {
e.Events[eventName] = Event{
Funcs: []EventFunc{event},
Once: once,
CallCounter: 0,
}
}
}
func (e EventEmitter) GetCallCount(eventName string) int {
for name, _ := range e.Events {
if name == eventName {
return e.Events[name].CallCounter
}
}
return 0
}
func (e *EventEmitter) On(eventName string, event EventFunc) {
e.AddEventListener(eventName, event, false)
}
func (e *EventEmitter) Once(eventName string, event EventFunc) {
e.AddEventListener(eventName, event, true)
}
func (e *EventEmitter) RemoveEventListener(eventName string) {
for name, _ := range e.Events {
if name == eventName {
delete(e.Events, name)
}
}
}
func (e *EventEmitter) Emit(eventName string, data interface{}) {
for name, event := range e.Events {
if name == eventName {
for _, fn := range event.Funcs {
fn(data)
if entry, ok := e.Events[name]; ok {
entry.CallCounter = entry.CallCounter + 1
e.Events[name] = entry
}
}
if event.Once {
delete(e.Events, eventName)
}
return
}
}
fmt.Printf("Event %s not found\n", eventName)
}
func main() {
emitter := EventEmitter{}
emitter.On("click", func(i interface{}) {
fmt.Print("Click1 -->")
fmt.Println(i)
})
emitter.On("click", func(i interface{}) {
fmt.Print("Click2 -->")
fmt.Println(i)
})
emitter.Emit("click", 1212)
fmt.Println(emitter.GetCallCount("click"))
emitter.RemoveEventListener("click")
emitter.Emit("click", "asddf")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment