40 lines
938 B
Go
40 lines
938 B
Go
|
package ucontainer
|
||
|
|
||
|
// Memo holds a cached value.
|
||
|
type Memo[T any] struct {
|
||
|
cache T
|
||
|
valid bool
|
||
|
update func () T
|
||
|
}
|
||
|
|
||
|
// NewMemo creates a new Memo which will take its value from the specified
|
||
|
// update callback.
|
||
|
func NewMemo[T any] (update func () T) Memo[T] {
|
||
|
return Memo[T] {
|
||
|
update: update,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Value returns the Memo's value, updating it if the current cached value is
|
||
|
// invalid.
|
||
|
func (this *Memo[T]) Value () T {
|
||
|
if !this.valid {
|
||
|
this.cache = this.update()
|
||
|
}
|
||
|
return this.cache
|
||
|
}
|
||
|
|
||
|
// Invalidate marks the Memo's value as invalid, which will cause it to be
|
||
|
// updated the next time Value is called.
|
||
|
func (this *Memo[T]) Invalidate () {
|
||
|
this.valid = false
|
||
|
}
|
||
|
|
||
|
// InvalidateTo invalidates the Memo and sets its value. The new value will be
|
||
|
// entirely inaccessible. This is only intended to be used for setting a
|
||
|
// reference to nil
|
||
|
func (this *Memo[T]) InvalidateTo (value T) {
|
||
|
this.Invalidate()
|
||
|
this.cache = value
|
||
|
}
|