1
0
mirror of https://github.com/duke-git/lancet.git synced 2026-02-08 22:52:29 +08:00

feat: add MapConcurrent

This commit is contained in:
dudaodong
2024-08-14 10:45:35 +08:00
parent f7e9d5dc47
commit 5c53cb5867
5 changed files with 130 additions and 1 deletions

View File

@@ -8,6 +8,33 @@ import (
"sync"
)
// MapConcurrent applies the iteratee function to each item in the slice by concrrent.
// Play: todo
func MapConcurrent[T any, U any](slice []T, numOfThreads int, iteratee func(index int, item T) U) []U {
result := make([]U, len(slice))
var wg sync.WaitGroup
workerChan := make(chan struct{}, numOfThreads)
for index, item := range slice {
wg.Add(1)
workerChan <- struct{}{}
go func(i int, v T) {
defer wg.Done()
result[i] = iteratee(i, v)
<-workerChan
}(index, item)
}
wg.Wait()
return result
}
// UniqueByParallel removes duplicate elements from the slice by parallel
// The comparator function is used to compare the elements
// The numOfThreads parameter specifies the number of threads to use