48 lines
818 B
Go
48 lines
818 B
Go
package gobot
|
|
|
|
type callback struct {
|
|
f func(interface{})
|
|
once bool
|
|
}
|
|
|
|
type Event struct {
|
|
Chan chan interface{}
|
|
Callbacks []callback
|
|
}
|
|
|
|
// NewEvent returns a new event which is then ready for publishing and subscribing.
|
|
func NewEvent() *Event {
|
|
e := &Event{
|
|
Chan: make(chan interface{}, 1),
|
|
Callbacks: []callback{},
|
|
}
|
|
go func() {
|
|
for {
|
|
e.Read()
|
|
}
|
|
}()
|
|
return e
|
|
}
|
|
|
|
// Write writes data to the Event
|
|
func (e *Event) Write(data interface{}) {
|
|
select {
|
|
case e.Chan <- data:
|
|
default:
|
|
}
|
|
}
|
|
|
|
// Read publishes to all subscribers of e if there is any new data
|
|
func (e *Event) Read() {
|
|
for s := range e.Chan {
|
|
tmp := []callback{}
|
|
for i := range e.Callbacks {
|
|
go e.Callbacks[i].f(s)
|
|
if !e.Callbacks[i].once {
|
|
tmp = append(tmp, e.Callbacks[i])
|
|
}
|
|
}
|
|
e.Callbacks = tmp
|
|
}
|
|
}
|