| 12345678910111213141516171819202122232425262728293031323334353637383940 |
- 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)
- }
- }
|