1
0
mirror of https://github.com/MontFerret/ferret.git synced 2025-04-19 12:12:16 +02:00

64 lines
924 B
Go
Raw Normal View History

2018-09-26 22:03:06 -04:00
package common
import (
"github.com/MontFerret/ferret/pkg/runtime/core"
"github.com/MontFerret/ferret/pkg/runtime/values"
"sync"
)
type (
LazyFactory func() (core.Value, error)
LazyValue struct {
sync.Mutex
factory LazyFactory
ready bool
value core.Value
err error
}
)
func NewLazyValue(factory LazyFactory) *LazyValue {
lz := new(LazyValue)
lz.ready = false
lz.factory = factory
lz.value = values.None
return lz
}
2018-09-27 00:26:56 -04:00
func (lv *LazyValue) Ready() bool {
lv.Lock()
defer lv.Unlock()
return lv.ready
}
2018-09-26 22:03:06 -04:00
func (lv *LazyValue) Value() (core.Value, error) {
lv.Lock()
defer lv.Unlock()
if !lv.ready {
val, err := lv.factory()
if err == nil {
lv.value = val
lv.err = nil
} else {
lv.value = values.None
lv.err = err
}
}
return lv.value, lv.err
}
func (lv *LazyValue) Reset() {
lv.Lock()
defer lv.Unlock()
lv.ready = false
lv.value = values.None
lv.err = nil
}