47 lines
560 B
Go
47 lines
560 B
Go
package lazy
|
|
|
|
func NewLazy[T any](provider func() (T, error)) Lazy[T] {
|
|
out := make(chan T)
|
|
err := make(chan error)
|
|
|
|
go func() {
|
|
val, e := provider()
|
|
if e != nil {
|
|
for {
|
|
err <- e
|
|
}
|
|
} else {
|
|
for {
|
|
out <- val
|
|
}
|
|
}
|
|
}()
|
|
|
|
return Lazy[T]{
|
|
out: out,
|
|
}
|
|
}
|
|
|
|
type Lazy[T any] struct {
|
|
out chan T
|
|
err chan error
|
|
}
|
|
|
|
func (l Lazy[T]) Get() (v T, e error) {
|
|
select {
|
|
case v = <-l.out:
|
|
return v, nil
|
|
case e = <-l.err:
|
|
return v, e
|
|
}
|
|
}
|
|
|
|
func (l Lazy[T]) MustGet() T {
|
|
v, err := l.Get()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
return v
|
|
}
|