package cache
import (
"regexp"
"sync"
"github.com/Knetic/govaluate"
"github.com/projectdiscovery/gcache"
)
var (
initOnce sync.Once
mu sync.RWMutex
regexCap = 4096
dslCap = 4096
regexCache gcache.Cache[string, *regexp.Regexp]
dslCache gcache.Cache[string, *govaluate.EvaluableExpression]
)
func initCaches() {
initOnce.Do(func() {
regexCache = gcache.New[string, *regexp.Regexp](regexCap).LRU().Build()
dslCache = gcache.New[string, *govaluate.EvaluableExpression](dslCap).LRU().Build()
})
}
func SetCapacities(regexCapacity, dslCapacity int) {
initCaches()
mu.Lock()
defer mu.Unlock()
if regexCapacity > 0 {
regexCap = regexCapacity
}
if dslCapacity > 0 {
dslCap = dslCapacity
}
if regexCapacity <= 0 && dslCapacity <= 0 {
return
}
regexCache = gcache.New[string, *regexp.Regexp](regexCap).LRU().Build()
dslCache = gcache.New[string, *govaluate.EvaluableExpression](dslCap).LRU().Build()
}
func Regex() gcache.Cache[string, *regexp.Regexp] {
initCaches()
mu.RLock()
defer mu.RUnlock()
return regexCache
}
func DSL() gcache.Cache[string, *govaluate.EvaluableExpression] {
initCaches()
mu.RLock()
defer mu.RUnlock()
return dslCache
}