-
Notifications
You must be signed in to change notification settings - Fork 0
/
filter.go
45 lines (40 loc) · 1.08 KB
/
filter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package enum
// FilterFunc takes a value and returns true if the
// value is to be kept.
type FilterFunc[T any] func(T) bool
// Filter filters a slice of values and keeps
// those for which f(value) returns true.
func Filter[T any](values []T, f FilterFunc[T]) []T {
var result []T
for _, v := range values {
if f(v) {
result = append(result, v)
}
}
return result
}
// FilterMap filters a slice of mapped values and keeps
// those for which f(value) returns true.
func FilterMap[S any, T any](values []S, m func(S) T, f FilterFunc[T]) []S {
var result []S
for _, v := range values {
if f(m(v)) {
result = append(result, v)
}
}
return result
}
// FilterFuncWithIndex takes an index and value and returns true if the
// value is to be kept.
type FilterFuncWithIndex[T any] func(int, T) bool
// FilterWithIndex filters a slice of values and keeps
// those for which f(index, value) returns true.
func FilterWithIndex[T any](values []T, f FilterFuncWithIndex[T]) []T {
var result []T
for i, v := range values {
if f(i, v) {
result = append(result, v)
}
}
return result
}