瀏覽代碼

Add memoization module

master
Matt Baer 7 年之前
父節點
當前提交
39a0df98f6
共有 1 個檔案被更改,包括 56 行新增0 行删除
  1. +56
    -0
      memo/memo.go

+ 56
- 0
memo/memo.go 查看文件

@@ -0,0 +1,56 @@
package memo

import (
"sync"
)

type (
Memo struct {
f Func
mu sync.Mutex //guards cache
cache *entry
}

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) *Memo {
return &Memo{
f: f,
}
}

func (memo *Memo) Invalidate() {
memo.mu.Lock()
memo.cache = nil
memo.mu.Unlock()
}

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
}

Loading…
取消
儲存