slices/slices.go

53 lines
1.2 KiB
Go

package slices
import (
"git.milar.in/milarin/channel"
)
func IndexOf[T comparable](slice []T, value T) int {
return IndexOfCmp(slice, value, DefaultEqualityComparator[T])
}
func IndexOfCmp[T comparable](slice []T, value T, cmp EqualityComparator[T]) int {
for i, v := range slice {
if cmp(v, value) {
return i
}
}
return -1
}
func Contains[T comparable](slice []T, value T) bool {
return ContainsCmp(slice, value, DefaultEqualityComparator[T])
}
func ContainsCmp[T comparable](slice []T, value T, cmp EqualityComparator[T]) bool {
return IndexOfCmp(slice, value, cmp) != -1
}
func Map[I, O any](slice []I, mapper func(I) O) []O {
ret := make([]O, 0, len(slice))
for _, v := range slice {
ret = append(ret, mapper(v))
}
return ret
}
func MapParallel[I, O any](slice []I, mapper func(I) O) []O {
return channel.ToSlice(channel.Map(channel.Of(slice...), mapper))
}
func MapParallelWithRunner[I, O any](slice []I, runner channel.Runner, mapper func(I) O) []O {
return channel.ToSlice(channel.MapWithRunner(channel.Of(slice...), runner, mapper))
}
func Each[T any](slice []T, f func(T)) {
EachIndex(slice, func(_ int, v T) { f(v) })
}
func EachIndex[T any](slice []T, f func(int, T)) {
for i, v := range slice {
f(i, v)
}
}