service/hook/recommend.go (55 lines of code) (raw):
package hook
import (
"sync"
"github.com/alibaba/pairec/v2/context"
)
type RecommendCleanHookFunc func(context *context.RecommendContext, params ...interface{})
var RecommendCleanHooks = make([]RecommendCleanHookFunc, 0)
func AddRecommendCleanHook(hf ...RecommendCleanHookFunc) {
RecommendCleanHooks = append(RecommendCleanHooks, hf...)
}
var mu sync.Mutex
var RecommendCleanHookMap = make(map[string]int)
func RegisterRecommendCleanHook(name string, hf RecommendCleanHookFunc) {
mu.Lock()
defer mu.Unlock()
if index, exist := RecommendCleanHookMap[name]; exist {
if index >= 0 && index < len(RecommendCleanHooks) {
RecommendCleanHooks[index] = hf
}
} else {
AddRecommendCleanHook(hf)
RecommendCleanHookMap[name] = len(RecommendCleanHooks) - 1
}
}
func RemoveRecommendCleanHook(name string) {
mu.Lock()
defer mu.Unlock()
removeIndex := -1
if index, exist := RecommendCleanHookMap[name]; exist {
removeIndex = index
} else {
return
}
indexMap := make(map[int]string)
for n, index := range RecommendCleanHookMap {
if n == name {
continue
}
indexMap[index] = n
}
var hookfuncs []RecommendCleanHookFunc
for index, hf := range RecommendCleanHooks {
if index == removeIndex {
continue
}
if n, ok := indexMap[index]; ok {
hookfuncs = append(hookfuncs, hf)
RecommendCleanHookMap[n] = len(hookfuncs) - 1
} else {
hookfuncs = append(hookfuncs, hf)
}
}
RecommendCleanHooks = hookfuncs
delete(RecommendCleanHookMap, name)
}