in table/internal/utils.go [489:540]
func MapExec[T, S any](nWorkers int, slice iter.Seq[T], fn func(T) (S, error)) iter.Seq2[S, error] {
if nWorkers <= 0 {
nWorkers = runtime.GOMAXPROCS(0)
}
var g errgroup.Group
ch := make(chan T, nWorkers)
out := make(chan S, nWorkers)
for range nWorkers {
g.Go(func() error {
for v := range ch {
result, err := fn(v)
if err != nil {
return err
}
out <- result
}
return nil
})
}
var err error
go func() {
defer close(out)
for v := range slice {
ch <- v
}
close(ch)
err = g.Wait()
}()
return func(yield func(S, error) bool) {
defer func() {
// drain out if we exit early
for range out {
}
}()
for v := range out {
if !yield(v, nil) {
return
}
}
if err != nil {
var z S
yield(z, err)
}
}
}