-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtrim.go
More file actions
173 lines (146 loc) · 4.68 KB
/
Copy pathtrim.go
File metadata and controls
173 lines (146 loc) · 4.68 KB
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
package slice
import (
"github.com/golang-infrastructure/go-gtypes"
"github.com/golang-infrastructure/go-maths"
"strings"
)
// ---------------------------------------------------------------------------------------------------------------------
// Trim 去除切片两端的零值元素
func Trim[T comparable](slice []T) []T {
var zero T
return TrimByFunc(slice, func(index int, item T) bool {
return item == zero
})
}
// TrimLeft 去除切片左边的零值元素
func TrimLeft[T comparable](slice []T) []T {
var zero T
return TrimLeftByFunc(slice, func(index int, item T) bool {
return item == zero
})
}
// TrimRight 去除右边的零值元素
func TrimRight[T comparable](slice []T) []T {
var zero T
return TrimRightByFunc[T](slice, func(index int, item T) bool {
return item == zero
})
}
// ---------------------------------------------------------------------------------------------------------------------
// TrimByFunc 从切片两侧trim,元素是否需要trim由自定义的trim函数决定
func TrimByFunc[T any](slice []T, itemFilterFunc func(index int, value T) bool) []T {
t := TrimLeftByFunc(slice, itemFilterFunc)
return TrimRightByFunc(t, itemFilterFunc)
}
// TrimLeftByFunc 从切片左边trim,根据自定义的函数来判定是否需要trim
func TrimLeftByFunc[T any](slice []T, itemFilterFunc func(index int, value T) bool) []T {
if len(slice) == 0 {
return nil
}
left := 0
for left < len(slice) {
if itemFilterFunc(left, slice[left]) {
break
}
left++
}
if left < len(slice) {
return slice[left:]
} else {
return nil
}
}
// TrimRightByFunc 从切片右边trim,根据自定义的函数来判定是否需要trim
func TrimRightByFunc[T any](slice []T, trimFunc func(index int, value T) bool) []T {
if len(slice) == 0 {
return nil
}
right := len(slice) - 1
for right >= 0 {
if trimFunc(right, slice[right]) {
break
}
right--
}
if right >= 0 {
return slice[:right+1]
} else {
return nil
}
}
// ---------------------------------------------------------------------------------------------------------------------
func TrimByBlankString(slice []string) []string {
return TrimByFunc(slice, func(index int, item string) bool {
return strings.TrimSpace(item) == ""
})
}
func TrimLeftByBlankString(slice []string) []string {
return TrimLeftByFunc(slice, func(index int, item string) bool {
return strings.TrimSpace(item) == ""
})
}
func TrimRightByBlankString(slice []string) []string {
return TrimRightByFunc(slice, func(index int, item string) bool {
return strings.TrimSpace(item) == ""
})
}
func TrimByEmptyString(slice []string) []string {
return TrimByFunc(slice, func(index int, item string) bool {
return item == ""
})
}
func TrimLeftByEmptyString(slice []string) []string {
return TrimLeftByFunc(slice, func(index int, item string) bool {
return item == ""
})
}
func TrimRightByEmptyString(slice []string) []string {
return TrimRightByFunc(slice, func(index int, item string) bool {
return item == ""
})
}
// ---------------------------------------------------------------------------------------------------------------------
func TrimIntegerByZero[T gtypes.Integer](slice []T) []T {
return TrimByFunc(slice, func(index int, item T) bool {
return item == 0
})
}
func TrimIntegerLeftByZero[T gtypes.Integer](slice []T) []T {
return TrimLeftByFunc(slice, func(index int, item T) bool {
return item == 0
})
}
func TrimIntegerRightByZero[T gtypes.Integer](slice []T) []T {
return TrimRightByFunc(slice, func(index int, item T) bool {
return item == 0
})
}
// ---------------------------------------------------------------------------------------------------------------------
// TrimFloatByZero 把浮点型切片的两侧的零值去除
func TrimFloatByZero[T gtypes.Float](slice []T) []T {
return TrimByFunc(slice, func(index int, item T) bool {
return maths.IsZero(item)
})
}
// TrimFloatLeftByZero 把浮点型切片的左侧的零值去除
func TrimFloatLeftByZero[T gtypes.Float](slice []T) []T {
return TrimLeftByFunc(slice, func(index int, item T) bool {
return maths.IsZero(item)
})
}
// TrimFloatRightByZero 把浮点型切片的右侧的零值去除
func TrimFloatRightByZero[T gtypes.Float](slice []T) []T {
return TrimRightByFunc(slice, func(index int, item T) bool {
return maths.IsZero(item)
})
}
// ------------------------------------------------ ---------------------------------------------------------------------
// TrimToNil 如果切片中没有元素的话,则将其置位nil
func TrimToNil[T any](slice []T) []T {
if len(slice) == 0 {
return nil
} else {
return slice
}
}
// ---------------------------------------------------------------------------------------------------------------------