Skip to content

Repository files navigation

AtomicGo



AtomicGo | event

DownloadsLatest ReleaseTestsCoverageUnit test countLicense: MITGo report


Documentation | Contributing | Code of Conduct


go get atomicgo.dev/event

event

import"atomicgo.dev/event"

Package event provides a generic and thread-safe event system for Go. It allows multiple listeners to subscribe to events carrying data of any type. Listeners can be added and notified when events are triggered, and the event can be closed to prevent further operations.

package main
import (
"fmt""time""atomicgo.dev/event"
)
funcdelay() {
time.Sleep(time.Millisecond*10)
}
typePlayerstruct {
Namestring
}
// Create a new eventvarPlayerJoinEvent=event.New[Player]()
funcmain() {
// Listen to the event as many times as you wantPlayerJoinEvent.Listen(func(pPlayer) {
fmt.Printf("Player %q joined the game\n", p.Name)
})
PlayerJoinEvent.Listen(func(_Player) {
// Do something else
})
// ...// Trigger the event somewhere - can be in a different function or packagePlayerJoinEvent.Trigger(Player{Name: "Marvin"})
delay() // delay for deterministic outputPlayerJoinEvent.Trigger(Player{Name: "Bob"})
delay() // delay for deterministic outputPlayerJoinEvent.Trigger(Player{Name: "Alice"})
// Keep the program alivetime.Sleep(time.Second)
}

Output

Player "Marvin" joined the game
Player "Bob" joined the game
Player "Alice" joined the game

Index

Variables

ErrEventClosed is returned when an operation is attempted on a closed event.

varErrEventClosed=errors.New("event is closed")

type Event

Event represents a generic, thread-safe event system that can handle multiple listeners. The type parameter T specifies the type of data that the event carries when triggered.

typeEvent[Tany] struct {
// contains filtered or unexported fields
}

func New

funcNew[Tany]() *Event[T]

New creates and returns a new Event instance for the specified type T.

func (*Event[T]) Close

func (e*Event[T]) Close()

Close closes the event system, preventing any new listeners from being added or events from being triggered. After calling Close, any subsequent calls to Trigger or Listen will return ErrEventClosed. Existing listeners are removed, and resources are cleaned up.

package main
import (
"fmt""time""atomicgo.dev/event"
)
funcdelay() {
time.Sleep(time.Millisecond*10)
}
funcmain() {
// Create a new eventexampleEvent:=event.New[int]()
// Listen to the eventexampleEvent.Listen(func(vint) {
fmt.Println(v)
})
// Trigger the eventexampleEvent.Trigger(1)
delay() // delay for deterministic outputexampleEvent.Trigger(2)
delay() // delay for deterministic outputexampleEvent.Trigger(3)
// Time for listeners to process the eventdelay()
// Close the eventexampleEvent.Close()
// Trigger the event againexampleEvent.Trigger(4)
delay() // delay for deterministic outputexampleEvent.Trigger(5)
delay() // delay for deterministic outputexampleEvent.Trigger(6)
// Keep the program alivetime.Sleep(time.Second)
}

Output

1
2
3

func (*Event[T]) Listen

func (e*Event[T]) Listen(ffunc(T)) error

Listen registers a new listener callback function for the event. The listener will be invoked with the event's data whenever Trigger is called. Returns ErrEventClosed if the event has been closed.

func (*Event[T]) Trigger

func (e*Event[T]) Trigger(valueT) error

Trigger notifies all registered listeners by invoking their callback functions with the provided value. It runs each listener in a separate goroutine and waits for all listeners to complete. Returns ErrEventClosed if the event has been closed.

Generated by gomarkdoc


AtomicGo.dev · with ❤️ by @MarvinJWendt | mjw.dev

About

📅 Simple generic event system for Go

Topics

Resources

Code of conduct

Stars

2 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages

Generated from atomicgo/template