diff --git a/event/event.go b/event/event.go index 3b4b0ed..d2a4820 100644 --- a/event/event.go +++ b/event/event.go @@ -9,46 +9,55 @@ type Cookie interface { Close () } -// Broadcaster manages event listeners -type Broadcaster struct { +// Broadcaster manages event listeners. +type Broadcaster[L any] struct { lastID int - listeners map[int] func () + listeners map[int] L } // Connect adds a new listener to the broadcaster and returns a corresponding // cookie. -func (broadcaster *Broadcaster) Connect (listener func ()) Cookie { - if listener == nil { return nil } - - if broadcaster.listeners == nil { - broadcaster.listeners = make(map[int] func ()) - } +func (broadcaster *Broadcaster[L]) Connect (listener L) Cookie { + broadcaster.ensure() cookie := broadcaster.newCookie() broadcaster.listeners[cookie.id] = listener return cookie } -// Broadcast runs all event listeners at once. -func (broadcaster *Broadcaster) Broadcast () { - for _, listener := range broadcaster.listeners { - listener() - } +// Listeners returns a map of all connected listeners. +func (broadcaster *Broadcaster[L]) Listeners () map[int] L { + broadcaster.ensure() + return broadcaster.listeners } -func (broadcaster *Broadcaster) newCookie () cookie { +func (broadcaster *Broadcaster[L]) newCookie () cookie[L] { broadcaster.lastID ++ - return cookie { + return cookie[L] { id: broadcaster.lastID, broadcaster: broadcaster, } } -type cookie struct { - id int - broadcaster *Broadcaster +func (broadcaster *Broadcaster[L]) ensure () { + if broadcaster.listeners == nil { + broadcaster.listeners = make(map[int] L) + } } -func (cookie cookie) Close () { +type cookie[L any] struct { + id int + broadcaster *Broadcaster[L] +} + +func (cookie cookie[L]) Close () { delete(cookie.broadcaster.listeners, cookie.id) } + +// FuncBroadcaster is a broadcaster that manages functions with no arguments. +type FuncBroadcaster Broadcaster[func ()] + +// Broadcast calls all connected listener funcs. +func (broadcaster *FuncBroadcaster) Broadcast () { + +}