Page Menu
Home
Musing Studio
Search
Configure Global Search
Log In
Files
F10671216
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
1 KB
Subscribers
None
View Options
diff --git a/memo/memo.go b/memo/memo.go
index a31c8be..8a88ccd 100644
--- a/memo/memo.go
+++ b/memo/memo.go
@@ -1,69 +1,79 @@
package memo
import (
"sync"
"time"
)
type (
Memo struct {
f Func
mu sync.Mutex //guards cache
cache *entry
cacheDur time.Duration
lastCache time.Time
}
Func func() (interface{}, error)
)
type (
entry struct {
res result
ready chan struct{} // close when res is read
}
result struct {
value interface{}
err error
}
)
func New(f Func, cd time.Duration) *Memo {
return &Memo{
f: f,
cacheDur: cd,
}
}
// Invalidate resets the cache to nil if the memo's given cache duration has
// elapsed, and returns true if the cache was actually invalidated.
func (memo *Memo) Invalidate() bool {
defer memo.mu.Unlock()
memo.mu.Lock()
if memo.cache != nil && time.Now().Sub(memo.lastCache) > memo.cacheDur {
memo.cache = nil
memo.lastCache = time.Now()
return true
}
return false
}
func (memo *Memo) Get() (value interface{}, err error) {
memo.mu.Lock()
if memo.cache == nil {
memo.cache = &entry{ready: make(chan struct{})}
memo.mu.Unlock()
memo.cache.res.value, memo.cache.res.err = memo.f()
close(memo.cache.ready)
} else {
memo.mu.Unlock()
<-memo.cache.ready
}
return memo.cache.res.value, memo.cache.res.err
}
+
+// Reset forcibly resets the cache to nil without checking if the cache
+// duration has elapsed.
+func (memo *Memo) Reset() {
+ defer memo.mu.Unlock()
+ memo.mu.Lock()
+
+ memo.cache = nil
+ memo.lastCache = time.Now()
+}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Sat, May 17, 9:04 AM (1 d, 14 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3241248
Attached To
rWC Write.as Web Core
Event Timeline
Log In to Comment