Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/gohugoio/hugo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'cache/partitioned_lazy_cache.go')
-rw-r--r--cache/partitioned_lazy_cache.go41
1 files changed, 30 insertions, 11 deletions
diff --git a/cache/partitioned_lazy_cache.go b/cache/partitioned_lazy_cache.go
index 9baf0377d..31e66e127 100644
--- a/cache/partitioned_lazy_cache.go
+++ b/cache/partitioned_lazy_cache.go
@@ -24,34 +24,52 @@ type Partition struct {
Load func() (map[string]interface{}, error)
}
-type lazyPartition struct {
+// Lazy represents a lazily loaded cache.
+type Lazy struct {
initSync sync.Once
+ initErr error
cache map[string]interface{}
load func() (map[string]interface{}, error)
}
-func (l *lazyPartition) init() error {
- var err error
+// NewLazy creates a lazy cache with the given load func.
+func NewLazy(load func() (map[string]interface{}, error)) *Lazy {
+ return &Lazy{load: load}
+}
+
+func (l *Lazy) init() error {
l.initSync.Do(func() {
- var c map[string]interface{}
- c, err = l.load()
+ c, err := l.load()
l.cache = c
+ l.initErr = err
+
})
- return err
+ return l.initErr
+}
+
+// Get initializes the cache if not already initialized, then looks up the
+// given key.
+func (l *Lazy) Get(key string) (interface{}, bool, error) {
+ l.init()
+ if l.initErr != nil {
+ return nil, false, l.initErr
+ }
+ v, found := l.cache[key]
+ return v, found, nil
}
// PartitionedLazyCache is a lazily loaded cache paritioned by a supplied string key.
type PartitionedLazyCache struct {
- partitions map[string]*lazyPartition
+ partitions map[string]*Lazy
}
// NewPartitionedLazyCache creates a new NewPartitionedLazyCache with the supplied
// partitions.
func NewPartitionedLazyCache(partitions ...Partition) *PartitionedLazyCache {
- lazyPartitions := make(map[string]*lazyPartition, len(partitions))
+ lazyPartitions := make(map[string]*Lazy, len(partitions))
for _, partition := range partitions {
- lazyPartitions[partition.Key] = &lazyPartition{load: partition.Load}
+ lazyPartitions[partition.Key] = NewLazy(partition.Load)
}
cache := &PartitionedLazyCache{partitions: lazyPartitions}
@@ -67,11 +85,12 @@ func (c *PartitionedLazyCache) Get(partition, key string) (interface{}, error) {
return nil, nil
}
- if err := p.init(); err != nil {
+ v, found, err := p.Get(key)
+ if err != nil {
return nil, err
}
- if v, found := p.cache[key]; found {
+ if found {
return v, nil
}