memoize.go 480 B

1234567891011121314151617181920212223242526
  1. package internal
  2. import (
  3. "sync"
  4. )
  5. type memoizedFunc[T any] struct {
  6. once sync.Once
  7. fn func() (T, error)
  8. result T
  9. err error
  10. }
  11. func (mf *memoizedFunc[T]) do() (T, error) {
  12. mf.once.Do(func() {
  13. mf.result, mf.err = mf.fn()
  14. })
  15. return mf.result, mf.err
  16. }
  17. // Memoize the result of a function call.
  18. //
  19. // fn is only ever called once, even if it returns an error.
  20. func Memoize[T any](fn func() (T, error)) func() (T, error) {
  21. return (&memoizedFunc[T]{fn: fn}).do
  22. }