1package csync
2
3import (
4 "iter"
5 "sync"
6)
7
8type LazySlice[K any] struct {
9 inner []K
10 mu sync.Mutex
11}
12
13func NewLazySlice[K any](load func() []K) *LazySlice[K] {
14 s := &LazySlice[K]{}
15 s.mu.Lock()
16 go func() {
17 s.inner = load()
18 s.mu.Unlock()
19 }()
20 return s
21}
22
23func (s *LazySlice[K]) Iter() iter.Seq[K] {
24 s.mu.Lock()
25 inner := s.inner
26 s.mu.Unlock()
27 return func(yield func(K) bool) {
28 for _, v := range inner {
29 if !yield(v) {
30 return
31 }
32 }
33 }
34}