alestane icon

Basic observer pattern

alestane | PRO | 03/05/13 12:34:03 AM UTC | 0 ⭐ | 300 👁️ | Never ⏰ | []
Go |

700 B

|

None

|

0 👍

/

0 👎

package Observer
 
type (
    Event struct {
        Content interface{}
        Response chan<- float32
    }
    Monitor chan<- Event
    Target interface{
        Add(monitor Monitor)
        Remove(monitor Monitor) bool
    }
    repeater []Monitor
)
 
func (self *repeater) Add(m Monitor) {
    *self = append(*self, m)
}
 
func (self *repeater) Remove(m Monitor) bool {
    for i, which := range *self {
        if which == m {
            copy((*self)[i:], (*self)[i + 1:])
            return true
        }
    }
    return false
}
 
func (self *repeater) repeat(source <-chan Event) {
    for e := range source {
        for _, m := range *self {
            m <- e
        }
    }
}
 
func NewTarget(source <-chan Event) Target {
    t := &repeater{}
    go t.repeat(source)
    return &t
}

Comments