-
Notifications
You must be signed in to change notification settings - Fork 2
/
transforms.go
125 lines (106 loc) · 2.44 KB
/
transforms.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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package kittehs
import (
"fmt"
)
func Transform[A, B any](as []A, f func(A) B) []B {
if as == nil {
return nil
}
bs := make([]B, len(as))
for i, a := range as {
bs[i] = f(a)
}
return bs
}
func TransformWithIndex[A, B any](as []A, f func(int, A) B) []B {
if as == nil {
return nil
}
bs := make([]B, len(as))
for i, a := range as {
bs[i] = f(i, a)
}
return bs
}
func TransformError[A, B any](as []A, f func(A) (B, error)) ([]B, error) {
if as == nil {
return nil, nil
}
bs := make([]B, len(as))
for i, a := range as {
var err error
if bs[i], err = f(a); err != nil {
return nil, fmt.Errorf("%w: %v", err, a)
}
}
return bs, nil
}
func TransformMapToList[K comparable, V, T any](m map[K]V, f func(K, V) T) []T {
l := make([]T, 0, len(m))
for k, v := range m {
l = append(l, f(k, v))
}
return l
}
func TransformMapToListError[K comparable, V, T any](m map[K]V, f func(K, V) (T, error)) ([]T, error) {
l := make([]T, 0, len(m))
for k, v := range m {
i, err := f(k, v)
if err != nil {
return nil, fmt.Errorf("%w: key %v, value %v", err, k, v)
}
l = append(l, i)
}
return l, nil
}
func TransformMap[A0, A1 comparable, B0, B1 any](m map[A0]B0, f func(A0, B0) (A1, B1)) map[A1]B1 {
m1 := make(map[A1]B1, len(m))
for k, v := range m {
k1, v1 := f(k, v)
m1[k1] = v1
}
return m1
}
func TransformMapError[A0, A1 comparable, B0, B1 any](m map[A0]B0, f func(A0, B0) (A1, B1, error)) (map[A1]B1, error) {
m1 := make(map[A1]B1, len(m))
for k, v := range m {
k1, v1, err := f(k, v)
if err != nil {
return nil, fmt.Errorf("%w: key %v, value %v", err, k, v)
}
m1[k1] = v1
}
return m1, nil
}
func TransformMapValues[A comparable, B0, B1 any](m map[A]B0, f func(B0) B1) map[A]B1 {
return TransformMap(m, func(a A, b B0) (A, B1) { return a, f(b) })
}
func TransformMapValuesError[A comparable, B0, B1 any](m map[A]B0, f func(B0) (B1, error)) (map[A]B1, error) {
return TransformMapError(m, func(a A, b B0) (A, B1, error) {
b1, err := f(b)
return a, b1, err
})
}
func TransformToStrings[T any](ts []T) []string {
return Transform(ts, func(t T) string { return ToString(t) })
}
func TransformUnptr[T any](in []*T) (out []T) {
if in == nil {
return nil
}
out = make([]T, len(in))
for i, t := range in {
out[i] = *t
}
return
}
func TransformPtr[T any](in []T) (out []*T) {
if in == nil {
return nil
}
out = make([]*T, len(in))
for i, t := range in {
out[i] = func(t T) *T { return &t }(t)
}
return
}