-
Notifications
You must be signed in to change notification settings - Fork 0
/
slice_pro.go
95 lines (80 loc) · 2.42 KB
/
slice_pro.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
/*
* Author: fasion
* Created time: 2022-11-19 17:24:48
* Last Modified by: fasion
* Last Modified time: 2023-12-21 11:51:21
*/
package stl
func AnyMatchPro[Data any, Datas ~[]Data](datas Datas, test func(int, Data, Datas) bool) bool {
for i, data := range datas {
if test(i, data, datas) {
return true
}
}
return false
}
func AllMatchPro[Data any, Datas ~[]Data](datas Datas, test func(int, Data, Datas) bool) bool {
for i, data := range datas {
if !test(i, data, datas) {
return false
}
}
return true
}
func ForEachPro[Data any, Datas ~[]Data](datas Datas, handler func(i int, data Data, datas Datas)) {
for i, data := range datas {
handler(i, data, datas)
}
}
func FilterPro[Data any, Datas ~[]Data](datas Datas, filter func(int, Data, Datas) bool) Datas {
result := make(Datas, 0, len(datas))
for i, data := range datas {
if filter(i, data, datas) {
result = append(result, data)
}
}
return result
}
func MapPro[Data any, Datas ~[]Data, Result any](datas Datas, mapper func(int, Data, Datas) Result) []Result {
results := make([]Result, 0, len(datas))
for i, data := range datas {
results = append(results, mapper(i, data, datas))
}
return results
}
func MapProArgs[Data any, Datas ~[]Data, Result any](mapper func(int, Data, Datas) Result, datas ...Data) []Result {
return MapPro(Datas(datas), mapper)
}
func MapWithErrorPro[Datas ~[]Data, Result any, Data any](datas Datas, stopWhenError bool, mapper func(int, Data, Datas) (Result, error)) (results []Result, errs Errors) {
// 分配空间
results = make([]Result, 0, len(datas))
errs = make(Errors, 0, len(datas))
for i, data := range datas {
result, err := mapper(i, data, datas)
results = append(results, result)
errs = append(errs, err)
if err != nil && stopWhenError {
return
}
}
return
}
func ReducePro[Data any, Datas ~[]Data, Result any](datas Datas, reducer func(Result, Data, int, Datas) Result, initial Result) (result Result) {
result = initial
for i, data := range datas {
result = reducer(result, data, i, datas)
}
return
}
func MappingByKeyPro[Data any, Datas ~[]Data, Key comparable](datas Datas, key func(int, Data, Datas) Key) map[Key]Data {
m := map[Key]Data{}
for i, data := range datas {
m[key(i, data, datas)] = data
}
return m
}
func InstancesToPointers[Data any, Instances ~[]Data](instances Instances) []*Data {
return MapPro(instances, func(i int, _ Data, datas Instances) *Data {
return &datas[i]
})
}