1 Star 0 Fork 0

lihaiping1603 / utils

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
event.go 3.45 KB
一键复制 编辑 原始数据 按行查看 历史
lihaiping1603 提交于 2022-07-22 14:33 . 修改event中的log包的使用
package event
import (
"context"
"errors"
"reflect"
"sync"
"gitee.com/lihaiping1603/utils/log"
)
type Event string
var (
// DefaultMaxListeners is the number of max listeners per event
DefaultMaxListeners = 10
DefaultMaxEvent = DefaultMaxListeners
)
var (
ErrorOverMaxListeners error = errors.New("the event listeners over max listeners limit")
)
var defaultEmmiter = NewEventEmit()
var (
AddListener = defaultEmmiter.AddListener
RemoveListener = defaultEmmiter.RemoveListener
Emit = defaultEmmiter.Emit
On = defaultEmmiter.On
Off = defaultEmmiter.Off
)
type EventListener func(event Event, args ...interface{})
type Emitter interface {
AddListener(event Event, listener EventListener) error
RemoveListener(event Event, listener EventListener) error
Emit(event Event, args ...interface{}) error
On(event Event, listeners ...EventListener) error
Off(event Event) error
}
type emitEvent struct {
event Event
Args []interface{}
}
type EventEmit struct {
cap int
mutex sync.Mutex
listeners map[Event][]EventListener
eventCh chan emitEvent
}
func NewEventEmit() Emitter {
return &EventEmit{cap: DefaultMaxListeners,
listeners: make(map[Event][]EventListener),
eventCh: make(chan emitEvent, DefaultMaxEvent)}
}
func (ee *EventEmit) On(event Event, listeners ...EventListener) error {
listeners_len := len(listeners)
if listeners_len > ee.cap {
log.Error("listeners len:%d >Event cap:%d", listeners_len, ee.cap)
return ErrorOverMaxListeners
}
ee.mutex.Lock()
defer ee.mutex.Unlock()
if _listeners, ok := ee.listeners[event]; ok {
if len(_listeners)+listeners_len > ee.cap {
log.Error("Event cap:%d over", ee.cap)
return ErrorOverMaxListeners
}
ee.listeners[event] = append(_listeners, listeners...)
} else {
ee.listeners[event] = listeners
}
return nil
}
func (ee *EventEmit) Off(event Event) error {
ee.mutex.Lock()
defer ee.mutex.Unlock()
delete(ee.listeners, event)
return nil
}
func (ee *EventEmit) Emit(event Event, args ...interface{}) error {
if ee.eventCh != nil {
ee.eventCh <- emitEvent{event: event, Args: args}
}
return nil
}
func (ee *EventEmit) AddListener(event Event, listener EventListener) error {
return ee.On(event, listener)
}
func (ee *EventEmit) RemoveListener(event Event, listener EventListener) error {
ee.mutex.Lock()
defer ee.mutex.Unlock()
if _listeners, ok := ee.listeners[event]; !ok {
return nil
} else {
listeners := []EventListener{}
idx := -1
listenerPointer := reflect.ValueOf(listener).Pointer()
for index, _listener := range _listeners {
_listenerPointer := reflect.ValueOf(_listener).Pointer()
if _listenerPointer == listenerPointer {
idx = index
break
}
}
if len(_listeners) > 1 {
listeners = append(_listeners[:idx], _listeners[idx+1:]...)
}
ee.listeners[event] = listeners
}
return nil
}
func (ee *EventEmit) eventListeners(event Event) []EventListener {
ee.mutex.Lock()
defer ee.mutex.Unlock()
resListeners := []EventListener{}
if listeners, ok := ee.listeners[event]; ok {
resListeners = append(resListeners, listeners...)
}
return resListeners
}
func (ee *EventEmit) cycle(ctx context.Context) {
for {
select {
case emit_event := <-ee.eventCh:
listeners := ee.eventListeners(emit_event.event)
callback := func() {
for _, listener := range listeners {
listener(emit_event.event, emit_event.Args...)
}
}
callback()
//go callback()
case <-ctx.Done():
break
}
}
}
Go
1
https://gitee.com/lihaiping1603/utils.git
git@gitee.com:lihaiping1603/utils.git
lihaiping1603
utils
utils
6ffc9e3a73a3

搜索帮助