mirror of
https://github.com/sst/opencode.git
synced 2025-08-23 22:44:08 +00:00
40 lines
729 B
Go
40 lines
729 B
Go
package util
|
|
|
|
import (
|
|
"strings"
|
|
)
|
|
|
|
func mapParallel[in, out any](items []in, fn func(in) out) chan out {
|
|
mapChans := make([]chan out, 0, len(items))
|
|
|
|
for _, v := range items {
|
|
ch := make(chan out)
|
|
mapChans = append(mapChans, ch)
|
|
go func() {
|
|
defer close(ch)
|
|
ch <- fn(v)
|
|
}()
|
|
}
|
|
|
|
resultChan := make(chan out)
|
|
|
|
go func() {
|
|
defer close(resultChan)
|
|
for _, ch := range mapChans {
|
|
v := <-ch
|
|
resultChan <- v
|
|
}
|
|
}()
|
|
|
|
return resultChan
|
|
}
|
|
|
|
// WriteStringsPar allows to iterate over a list and compute strings in parallel,
|
|
// yet write them in order.
|
|
func WriteStringsPar[a any](sb *strings.Builder, items []a, fn func(a) string) {
|
|
ch := mapParallel(items, fn)
|
|
|
|
for v := range ch {
|
|
sb.WriteString(v)
|
|
}
|
|
}
|