diff options
Diffstat (limited to 'filter.go')
-rw-r--r-- | filter.go | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/filter.go b/filter.go new file mode 100644 index 0000000..20c23a9 --- /dev/null +++ b/filter.go @@ -0,0 +1,34 @@ +package collection + +import "sync" + +func FilterSync[T any](collection []T, filter func(item T, idx int) bool) []T { + var result []T + for i, v := range collection { + if filter(v, i) { + result = append(result, v) + } + } + return result +} + +func Filter[T any](collection []T, filter func(item T, idx int) bool) []T { + var result []T + mu := sync.Mutex{} + wg := sync.WaitGroup{} + wg.Add(len(collection)) + for i, v := range collection { + func(v T, i int) { + go func() { + defer wg.Done() + if filter(v, i) { + mu.Lock() + result = append(result, v) + mu.Unlock() + } + }() + }(v, i) + } + wg.Wait() + return result +} |