Created
January 15, 2022 20:21
-
-
Save marmiha/83a2d16670bce7649ce85981861cb7e1 to your computer and use it in GitHub Desktop.
Typesafe Event System - Base Go
This file contains 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
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. |
This file contains 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
// 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