keyproofs/pkg/promise/with-cache.go
2020-11-23 14:07:59 -07:00

48 lines
1.0 KiB
Go

package promise
import (
"time"
"github.com/rs/zerolog/log"
"github.com/sour-is/keyproofs/pkg/cache"
)
func WithCache(c cache.Cacher, expireAfter time.Duration) OptionFn {
return func(task *qTask) {
innerFn := task.fn
task.fn = func(q Q) {
log := log.Ctx(q.Context())
cacheKey, ok := q.Key().(cache.Key)
if !ok {
log.Trace().Interface(typ(q), q.Key()).Msg("not a cache key")
innerFn(q)
return
}
if v, ok := c.Get(cacheKey); ok {
log.Trace().Interface(typ(cacheKey), cacheKey.Key()).Msg("task result in cache")
q.Resolve(v.Value())
return
}
log.Trace().Interface(typ(cacheKey), cacheKey.Key()).Msg("task not in cache")
innerFn(q)
if err := task.Err(); err != nil {
log.Err(err)
return
}
// expireAfter = time.Duration(rand.Int63() % int64(5*time.Second))
result := cache.NewItem(cacheKey, task.Result(), expireAfter)
log.Trace().Interface(typ(cacheKey), cacheKey.Key()).Msgf("task result to cache")
c.Add(cacheKey, result)
}
}
}