tomo/event/event.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)
}