github.com/sixexorg/magnetic-ring@v0.0.0-20191119090307-31705a21e419/events/event.go (about) 1 /* 2 * Copyright (C) 2018 The ontology Authors 3 * This file is part of The ontology library. 4 * 5 * The ontology is free software: you can redistribute it and/or modify 6 * it under the terms of the GNU Lesser General Public License as published by 7 * the Free Software Foundation, either version 3 of the License, or 8 * (at your option) any later version. 9 * 10 * The ontology is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU Lesser General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public License 16 * along with The ontology. If not, see <http://www.gnu.org/licenses/>. 17 */ 18 19 package events 20 21 import ( 22 "errors" 23 "sync" 24 ) 25 26 type Event struct { 27 m sync.RWMutex 28 subscribers map[EventType]map[Subscriber]EventFunc 29 } 30 31 func NewEvent() *Event { 32 return &Event{ 33 subscribers: make(map[EventType]map[Subscriber]EventFunc), 34 } 35 } 36 37 // adds a new subscriber to Event. 38 func (e *Event) Subscribe(eventtype EventType, eventfunc EventFunc) Subscriber { 39 e.m.Lock() 40 defer e.m.Unlock() 41 42 sub := make(chan interface{}) 43 _, ok := e.subscribers[eventtype] 44 if !ok { 45 e.subscribers[eventtype] = make(map[Subscriber]EventFunc) 46 } 47 e.subscribers[eventtype][sub] = eventfunc 48 49 return sub 50 } 51 52 // UnSubscribe removes the specified subscriber 53 func (e *Event) UnSubscribe(eventtype EventType, subscriber Subscriber) (err error) { 54 e.m.Lock() 55 defer e.m.Unlock() 56 57 subEvent, ok := e.subscribers[eventtype] 58 if !ok { 59 err = errors.New("No event type.") 60 return 61 } 62 63 delete(subEvent, subscriber) 64 close(subscriber) 65 66 return 67 } 68 69 //Notify subscribers that Subscribe specified event 70 func (e *Event) Notify(eventtype EventType, value interface{}) (err error) { 71 e.m.RLock() 72 defer e.m.RUnlock() 73 74 subs, ok := e.subscribers[eventtype] 75 if !ok { 76 err = errors.New("No event type.") 77 return 78 } 79 80 for _, event := range subs { 81 go e.NotifySubscriber(event, value) 82 } 83 return 84 } 85 86 func (e *Event) NotifySubscriber(eventfunc EventFunc, value interface{}) { 87 if eventfunc == nil { 88 return 89 } 90 91 //invode subscriber event func 92 eventfunc(value) 93 94 } 95 96 //Notify all event subscribers 97 func (e *Event) NotifyAll() (errs []error) { 98 e.m.RLock() 99 defer e.m.RUnlock() 100 101 for eventtype, _ := range e.subscribers { 102 if err := e.Notify(eventtype, nil); err != nil { 103 errs = append(errs, err) 104 } 105 } 106 107 return errs 108 }