mirror of
https://github.com/samuelncui/acp.git
synced 2026-07-21 23:12:18 +00:00
23 lines
410 B
Go
23 lines
410 B
Go
package acp
|
|
|
|
import "sync"
|
|
|
|
type cacheEntry[V any] struct {
|
|
once sync.Once
|
|
value V
|
|
}
|
|
|
|
func Cache[K comparable, V any](f func(in K) V) func(in K) V {
|
|
var cache sync.Map
|
|
return func(in K) V {
|
|
cached, has := cache.Load(in)
|
|
if !has {
|
|
cached, _ = cache.LoadOrStore(in, new(cacheEntry[V]))
|
|
}
|
|
|
|
entry := cached.(*cacheEntry[V])
|
|
entry.once.Do(func() { entry.value = f(in) })
|
|
return entry.value
|
|
}
|
|
}
|