1234567891011121314151617181920212223242526 |
- package internal
- import (
- "sync"
- )
- type memoizedFunc[T any] struct {
- once sync.Once
- fn func() (T, error)
- result T
- err error
- }
- func (mf *memoizedFunc[T]) do() (T, error) {
- mf.once.Do(func() {
- mf.result, mf.err = mf.fn()
- })
- return mf.result, mf.err
- }
- // Memoize the result of a function call.
- //
- // fn is only ever called once, even if it returns an error.
- func Memoize[T any](fn func() (T, error)) func() (T, error) {
- return (&memoizedFunc[T]{fn: fn}).do
- }
|