github.com/acornpublishing/functional-programming-go@v0.0.0-20220401005601-c3bd3786d5a1/Chapter06/03_observer/src/observer/subject.go (about)

     1  package observer
     2  
     3  type Subject struct {
     4  	callbacks []Callback
     5  }
     6  
     7  func (o *Subject) AddObserver(c Callback) {
     8  	o.callbacks = append(o.callbacks, c)
     9  }
    10  func (o *Subject) DeleteObserver(c Callback) {
    11  	o.callbacks = append(o.callbacks, c)
    12  
    13  	newCallbacks := []Callback{}
    14  	for _, cb := range o.callbacks {
    15  		if cb != c {
    16  			newCallbacks = append(newCallbacks, cb)
    17  		}
    18  	}
    19  	o.callbacks = newCallbacks
    20  }
    21  
    22  func (o *Subject) NotifyObservers(oes ...Observable) {
    23  	for _, oe := range oes {
    24  		for _, c := range o.callbacks {
    25  			c.Notify(&oe)
    26  		}
    27  	}
    28  }