71 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package filter
 | 
						|
 | 
						|
import "reflect"
 | 
						|
 | 
						|
type Filter interface {
 | 
						|
	Compare(Filter) bool
 | 
						|
	Trigger(data interface{})
 | 
						|
}
 | 
						|
 | 
						|
type FilterEvent struct {
 | 
						|
	filter Filter
 | 
						|
	data   interface{}
 | 
						|
}
 | 
						|
 | 
						|
type Filters struct {
 | 
						|
	id       int
 | 
						|
	watchers map[int]Filter
 | 
						|
	ch       chan FilterEvent
 | 
						|
 | 
						|
	quit chan struct{}
 | 
						|
}
 | 
						|
 | 
						|
func New() *Filters {
 | 
						|
	return &Filters{
 | 
						|
		ch:       make(chan FilterEvent),
 | 
						|
		watchers: make(map[int]Filter),
 | 
						|
		quit:     make(chan struct{}),
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (self *Filters) Start() {
 | 
						|
	go self.loop()
 | 
						|
}
 | 
						|
 | 
						|
func (self *Filters) Stop() {
 | 
						|
	close(self.quit)
 | 
						|
}
 | 
						|
 | 
						|
func (self *Filters) Notify(filter Filter, data interface{}) {
 | 
						|
	self.ch <- FilterEvent{filter, data}
 | 
						|
}
 | 
						|
 | 
						|
func (self *Filters) Install(watcher Filter) int {
 | 
						|
	self.watchers[self.id] = watcher
 | 
						|
	self.id++
 | 
						|
 | 
						|
	return self.id - 1
 | 
						|
}
 | 
						|
 | 
						|
func (self *Filters) Uninstall(id int) {
 | 
						|
	delete(self.watchers, id)
 | 
						|
}
 | 
						|
 | 
						|
func (self *Filters) loop() {
 | 
						|
out:
 | 
						|
	for {
 | 
						|
		select {
 | 
						|
		case <-self.quit:
 | 
						|
			break out
 | 
						|
		case event := <-self.ch:
 | 
						|
			for _, watcher := range self.watchers {
 | 
						|
				if reflect.TypeOf(watcher) == reflect.TypeOf(event.filter) {
 | 
						|
					if watcher.Compare(event.filter) {
 | 
						|
						watcher.Trigger(event.data)
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |