Created
November 20, 2022 19:27
-
-
Save mcihad/acf2c357784defcff1cda176241ebb44 to your computer and use it in GitHub Desktop.
Golang EventEmitter
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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