2014-06-12 02:37:20 +08:00
|
|
|
package gobot
|
|
|
|
|
2014-07-14 11:27:38 +08:00
|
|
|
type callback struct {
|
|
|
|
f func(interface{})
|
|
|
|
once bool
|
|
|
|
}
|
|
|
|
|
2014-12-31 21:15:52 +08:00
|
|
|
// Event executes the list of Callbacks when Chan is written to.
|
2014-06-12 02:37:20 +08:00
|
|
|
type Event struct {
|
|
|
|
Chan chan interface{}
|
2014-07-14 11:27:38 +08:00
|
|
|
Callbacks []callback
|
2014-06-12 02:37:20 +08:00
|
|
|
}
|
|
|
|
|
2014-12-31 21:15:52 +08:00
|
|
|
// NewEvent returns a new Event which is now listening for data.
|
2014-06-12 02:37:20 +08:00
|
|
|
func NewEvent() *Event {
|
|
|
|
e := &Event{
|
|
|
|
Chan: make(chan interface{}, 1),
|
2014-07-14 11:27:38 +08:00
|
|
|
Callbacks: []callback{},
|
2014-06-12 02:37:20 +08:00
|
|
|
}
|
|
|
|
go func() {
|
|
|
|
for {
|
|
|
|
e.Read()
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
return e
|
|
|
|
}
|
|
|
|
|
2014-12-31 21:15:52 +08:00
|
|
|
// Write writes data to the Event, it will not block and will not buffer if there
|
|
|
|
// are no active subscribers to the Event.
|
2014-06-12 02:37:20 +08:00
|
|
|
func (e *Event) Write(data interface{}) {
|
|
|
|
select {
|
|
|
|
case e.Chan <- data:
|
|
|
|
default:
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-12-31 21:15:52 +08:00
|
|
|
// Read executes all Callbacks when new data is available.
|
2014-06-12 02:37:20 +08:00
|
|
|
func (e *Event) Read() {
|
|
|
|
for s := range e.Chan {
|
2014-07-15 04:34:46 +08:00
|
|
|
tmp := []callback{}
|
2014-07-14 11:27:38 +08:00
|
|
|
for i := range e.Callbacks {
|
|
|
|
go e.Callbacks[i].f(s)
|
|
|
|
if !e.Callbacks[i].once {
|
|
|
|
tmp = append(tmp, e.Callbacks[i])
|
|
|
|
}
|
2014-06-12 02:37:20 +08:00
|
|
|
}
|
2014-07-14 11:27:38 +08:00
|
|
|
e.Callbacks = tmp
|
2014-06-12 02:37:20 +08:00
|
|
|
}
|
|
|
|
}
|