buildr/internal/lazy/lazy.go
2023-06-18 14:34:20 +02:00

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
}