Skip to content

Instantly share code, notes, and snippets.

@marmiha
Created January 15, 2022 20:21
Show Gist options
  • Save marmiha/83a2d16670bce7649ce85981861cb7e1 to your computer and use it in GitHub Desktop.
Save marmiha/83a2d16670bce7649ce85981861cb7e1 to your computer and use it in GitHub Desktop.
Typesafe Event System - Base Go
import "events"
import "fmt"
func main() {
se1 = &someEventListener{}
se2 = &someEventListener{}
// Register the Listeners.
events.SomeEvent.Register(se1)
events.SomeEvent.Register(se2)
// Trigger the Event.
events.SomeEvent.Trigger(&someEventPayload{
message: "Hey, listeners.",
})
}
// HandleSomeEvent interface implementation.
type someEventListener struct {}
func (el *someEventListener) HandleSomeEvent(payload SomeEventPayload) {
// Do something with the payload.
fmt.Println(payload.GetMessage())
}
// SomeEventPayload interface implementation.
type someEventPayload struct {
message string
}
func (sep *someEventPayload) GetMessage() string {
return sep.message
}
// SomeEventPayload interface implementation.
// Placed inside the events/.
package events
// This public variable gets initialized on "events" package import.
var SomeEvent someEvent
////////////////////////////////////////////////////////////////////
// Struct with a List of SomeEvent listeners.
type someEvent struct {
handlers []SomeEventHandler
}
// Example EventPayload Interface.
type SomeEventPayload interface {
GetMessage() string
}
// Interface, that the SomeEvent listener should implement.
type SomeEventHandler interface {
HandleSomeEvent(payload SomeEventPayload)
}
// Register a Listener.
func (e *someEvent) Register(handler BackupsUpdatedHandler) {
e.handlers = append(e.handlers, handler)
}
// Outer packages trigger this function.
func (e *someEvent) Trigger(payload SomeEventPayload) {
for _, handler := range e.handlers {
go handler.HandleSomeEvent(payload)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment