github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/event/filter/filter.go (about) 1 2 //此源码被清华学神尹成大魔王专业翻译分析并修改 3 //尹成QQ77025077 4 //尹成微信18510341407 5 //尹成所在QQ群721929980 6 //尹成邮箱 yinc13@mails.tsinghua.edu.cn 7 //尹成毕业于清华大学,微软区块链领域全球最有价值专家 8 //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620 9 //版权所有2014 Go Ethereum作者 10 //此文件是Go以太坊库的一部分。 11 // 12 //Go-Ethereum库是免费软件:您可以重新分发它和/或修改 13 //根据GNU发布的较低通用公共许可证的条款 14 //自由软件基金会,或者许可证的第3版,或者 15 //(由您选择)任何更高版本。 16 // 17 //Go以太坊图书馆的发行目的是希望它会有用, 18 //但没有任何保证;甚至没有 19 //适销性或特定用途的适用性。见 20 //GNU较低的通用公共许可证,了解更多详细信息。 21 // 22 //你应该收到一份GNU较低级别的公共许可证副本 23 //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。 24 25 //包筛选器实现事件筛选器。 26 package filter 27 28 import "reflect" 29 30 type Filter interface { 31 Compare(Filter) bool 32 Trigger(data interface{}) 33 } 34 35 type FilterEvent struct { 36 filter Filter 37 data interface{} 38 } 39 40 type Filters struct { 41 id int 42 watchers map[int]Filter 43 ch chan FilterEvent 44 45 quit chan struct{} 46 } 47 48 func New() *Filters { 49 return &Filters{ 50 ch: make(chan FilterEvent), 51 watchers: make(map[int]Filter), 52 quit: make(chan struct{}), 53 } 54 } 55 56 func (f *Filters) Start() { 57 go f.loop() 58 } 59 60 func (f *Filters) Stop() { 61 close(f.quit) 62 } 63 64 func (f *Filters) Notify(filter Filter, data interface{}) { 65 f.ch <- FilterEvent{filter, data} 66 } 67 68 func (f *Filters) Install(watcher Filter) int { 69 f.watchers[f.id] = watcher 70 f.id++ 71 72 return f.id - 1 73 } 74 75 func (f *Filters) Uninstall(id int) { 76 delete(f.watchers, id) 77 } 78 79 func (f *Filters) loop() { 80 out: 81 for { 82 select { 83 case <-f.quit: 84 break out 85 case event := <-f.ch: 86 for _, watcher := range f.watchers { 87 if reflect.TypeOf(watcher) == reflect.TypeOf(event.filter) { 88 if watcher.Compare(event.filter) { 89 watcher.Trigger(event.data) 90 } 91 } 92 } 93 } 94 } 95 } 96 97 func (f *Filters) Match(a, b Filter) bool { 98 return reflect.TypeOf(a) == reflect.TypeOf(b) && a.Compare(b) 99 } 100 101 func (f *Filters) Get(i int) Filter { 102 return f.watchers[i] 103 }