53 lines
1.1 KiB
Go
53 lines
1.1 KiB
Go
package event
|
|
|
|
// A cookie is returned when you add an event handler so you can remove it
|
|
// later if you so choose.
|
|
type Cookie interface {
|
|
// Close removes the event handler this cookie is for.
|
|
Close ()
|
|
}
|
|
|
|
// Broadcaster manages event listeners
|
|
type Broadcaster struct {
|
|
lastID int
|
|
listeners map[int] func ()
|
|
}
|
|
|
|
// 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 ())
|
|
}
|
|
|
|
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()
|
|
}
|
|
}
|
|
|
|
func (broadcaster *Broadcaster) newCookie () cookie {
|
|
broadcaster.lastID ++
|
|
return cookie {
|
|
id: broadcaster.lastID,
|
|
broadcaster: broadcaster,
|
|
}
|
|
}
|
|
|
|
type cookie struct {
|
|
id int
|
|
broadcaster *Broadcaster
|
|
}
|
|
|
|
func (cookie cookie) Close () {
|
|
delete(cookie.broadcaster.listeners, cookie.id)
|
|
}
|