package slices func Filter[T any](slice []T, f FilterFunc[T]) []T { ret := make([]T, 0, len(slice)) for _, v := range slice { if f(v) { ret = append(ret, v) } } return ret } func FindFirst[T any](slice []T, f FilterFunc[T]) (T, bool) { for _, v := range slice { if f(v) { return v, true } } return *new(T), false } func FindFirstIndex[T any](slice []T, f FilterFunc[T]) (int, bool) { for i, v := range slice { if f(v) { return i, true } } return -1, false } func FindLastIndex[T any](slice []T, f FilterFunc[T]) (int, bool) { for i := len(slice); i >= 0; i-- { if f(slice[i]) { return i, true } } return -1, false } func Not[T any](filter FilterFunc[T]) FilterFunc[T] { return func(v T) bool { return !filter(v) } } func And[T any](filters ...FilterFunc[T]) FilterFunc[T] { return func(v T) bool { for _, filter := range filters { if !filter(v) { return false } } return true } } func Or[T any](filters ...FilterFunc[T]) FilterFunc[T] { return func(v T) bool { for _, filter := range filters { if filter(v) { return true } } return false } }