-
Notifications
You must be signed in to change notification settings - Fork 0
/
tools.go
66 lines (50 loc) · 977 Bytes
/
tools.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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package reiterate
func Map[A any, AT ~[]A, B any, BT ~[]B](as AT, f func(A) B) BT {
bs := make(BT, len(as))
for i, a := range as {
bs[i] = f(a)
}
return bs
}
func Filter[A any, AT ~[]A, F func(A) bool](as AT, f F) AT {
var na AT
for _, a := range as {
if f(a) {
na = append(na, a)
}
}
return na
}
func IndexOf[A comparable, AS ~[]A](a A, as AS) int {
for i, b := range as {
if a == b {
return i
}
}
return -1
}
func Contains[A comparable, AS ~[]A](a A, as AS) bool {
return -1 != IndexOf(a, as)
}
func InPlaceReverse[A any, AS ~[]A](a AS) {
middle := len(a) / 2
for i := 0; i < middle; i++ {
n := len(a) - i - 1
b := a[i]
c := a[n]
a[i], a[n] = c, b
}
}
func MakeReversed[A any, AS ~[]A](a AS) AS {
rev := make(AS, len(a))
middle := len(a) / 2
for i := 0; i < middle; i++ {
n := len(a) - i - 1
rev[i], rev[n] = a[n], a[i]
}
if len(a)&1 == 1 {
// this little piggy too
rev[middle] = a[middle]
}
return rev
}