-
Notifications
You must be signed in to change notification settings - Fork 0
/
array.go
135 lines (127 loc) · 2.63 KB
/
array.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
126
127
128
129
130
131
132
133
134
135
package qkit
// Filter returns a new slice containing only the elements in tt for which the match function returns true.
//
// type User struct {
// Name string
// Age int
// Active bool
// }
//
// var users = []User{
// {"Tom", 20, true},
// {"Jack", 22, false},
// {"Mary", 18, true},
// }
//
// var activeUsers = qkit.Filter(func(u User) bool {
// return u.Active
// }, users)
//
// fmt.Println(activeUsers)
//
// Playground: https://go.dev/play/p/70YOKRs79OF
func Filter[T any](match func(src T) bool, tt []T) []T {
ftt := make([]T, 0, len(tt))
for _, t := range tt {
if match(t) {
ftt = append(ftt, t)
}
}
return ftt[:len(ftt):len(ftt)]
}
// Map applies the transformer function to each element of the slice ss. The result is a slice of the same length as ss, where the kth element is transformer(ss[k]).
//
// type User struct {
// Name string
// Age int
// }
//
// var users = []User{
// {"Tom", 20},
// {"Jack", 22},
// {"Mary", 18},
// }
//
// var names = qkit.Map(func(u User) string {
// return u.Name
// }, users)
//
// fmt.Println(names)
//
// Playground: https://go.dev/play/p/wKIa32-rMDn
func Map[S, D any](transformer func(src S) D, ss []S) []D {
dd := make([]D, len(ss))
for k, src := range ss {
dd[k] = transformer(src)
}
return dd
}
// Reduce [T, R] reduces the slice tt to a single value r using the reducer
// function. The reducer function takes the current reduced value r and the
// current slice value t and returns a new reduced value.
//
// type User struct {
// Name string
// Age int
// }
//
// var users = []User{
// {"Tom", 20},
// {"Jack", 22},
// {"Mary", 18},
// }
//
// var totalAge = qkit.Reduce(func(r int, u User) int {
// return r + u.Age
// }, users)
//
// fmt.Println(totalAge)
//
// Playground: https://go.dev/play/p/gf9evzMIMIK
func Reduce[T, R any](reducer func(r R, t T) R, tt []T) R {
var r R
for _, t := range tt {
r = reducer(r, t)
}
return r
}
// Paginate will call the given function with start and end indexes
// for a slice of the given size.
//
// type User struct {
// Name string
// Age int
// }
//
// var users = []User{
// {"Tom", 20},
// {"Jack", 22},
// {"Mary", 18},
// {"Tommy", 20},
// {"Lin", 22},
// }
//
// qkit.Paginate(users, 2, func(start, end int) error {
// fmt.Println(users[start:end])
// return nil
// })
//
// Playground: https://go.dev/play/p/aDiVJEKjgwW
func Paginate[T any](arr []T, pageSize int, fn func(start, end int) error) error {
start := 0
for {
end := start + pageSize
if end > len(arr) {
end = len(arr)
}
err := fn(start, end)
if err != nil {
return err
}
start = end
if start >= len(arr) {
break
}
}
return nil
}