@@ -2,26 +2,26 @@ package array
22
33import (
44 "fmt"
5- "math/rand"
5+ "math/rand/v2"
6+ "slices"
67 "sort"
78 "strings"
8- "time"
99)
1010
1111type Number interface {
12- ~ int | ~ int8 | ~ int16 | ~ int32 | ~ int64 | ~ uint | ~ uint8 | ~ uint16 | ~ uint32 | ~ uint64 | ~ float32 | ~ float64
12+ ~ int | ~ int8 | ~ int16 | ~ int32 | ~ int64 |
13+ ~ uint | ~ uint8 | ~ uint16 | ~ uint32 | ~ uint64 | ~ uintptr |
14+ ~ float32 | ~ float64
1315}
1416
1517func Filter [T any ](a []T , f func (T ) bool ) []T {
16- y := make ([]T , len (a ))
17- i := 0
18+ y := make ([]T , 0 , len (a ))
1819 for _ , x := range a {
1920 if f (x ) {
20- y [i ] = x
21- i ++
21+ y = append (y , x )
2222 }
2323 }
24- return y [: i ]
24+ return y
2525}
2626
2727// with side effects
@@ -54,9 +54,9 @@ func Find[T any](a []T, f func(T) bool) T {
5454 */
5555
5656func Map [T , U any ](a []T , f func (T ) U ) []U {
57- var b = make ([]U , len (a ))
58- for i := 0 ; i < len ( a ); i ++ {
59- b [i ] = f (a [ i ] )
57+ b : = make ([]U , len (a ))
58+ for i , x := range a {
59+ b [i ] = f (x )
6060 }
6161
6262 return b
@@ -126,12 +126,7 @@ func Any[T any](input []T, f func(T) bool) bool {
126126 */
127127
128128func Some [T any ](a []T , f func (T ) bool ) bool {
129- for _ , x := range a {
130- if f (x ) {
131- return true
132- }
133- }
134- return false
129+ return Any (a , f )
135130}
136131
137132/* Every
@@ -157,7 +152,14 @@ func Every[T any](a []T, f func(T) bool) bool {
157152 */
158153
159154func Sum [T Number ](a []T ) T {
160- return Reduce (a , func (x , y T ) T { return x + y })
155+ if len (a ) == 0 {
156+ panic ("empty array" )
157+ }
158+ total := a [0 ]
159+ for _ , x := range a [1 :] {
160+ total += x
161+ }
162+ return total
161163}
162164
163165/* Product array of numbers
@@ -167,7 +169,14 @@ func Sum[T Number](a []T) T {
167169* fmt.Println(b) // 120
168170 */
169171func Product [T Number ](a []T ) T {
170- return Reduce (a , func (x , y T ) T { return x * y })
172+ if len (a ) == 0 {
173+ panic ("empty array" )
174+ }
175+ total := a [0 ]
176+ for _ , x := range a [1 :] {
177+ total *= x
178+ }
179+ return total
171180}
172181
173182/* Min array of numbers
@@ -177,12 +186,17 @@ func Product[T Number](a []T) T {
177186* fmt.Println(b) // 1
178187 */
179188func Min [T Number ](a []T ) T {
180- return Reduce (a , func (x , y T ) T {
181- if x < y {
182- return x
189+ if len (a ) == 0 {
190+ panic ("empty array" )
191+ }
192+ minimum := a [0 ]
193+ for _ , x := range a [1 :] {
194+ if minimum < x {
195+ continue
183196 }
184- return y
185- })
197+ minimum = x
198+ }
199+ return minimum
186200}
187201
188202/* Max array of numbers
@@ -193,12 +207,17 @@ func Min[T Number](a []T) T {
193207 */
194208
195209func Max [T Number ](a []T ) T {
196- return Reduce (a , func (x , y T ) T {
197- if x > y {
198- return x
210+ if len (a ) == 0 {
211+ panic ("empty array" )
212+ }
213+ maximum := a [0 ]
214+ for _ , x := range a [1 :] {
215+ if maximum > x {
216+ continue
199217 }
200- return y
201- })
218+ maximum = x
219+ }
220+ return maximum
202221}
203222
204223/* ForEach
@@ -219,12 +238,7 @@ func ForEach[T any](a []T, f func(T)) {
219238* fmt.Println(b) // 2
220239 */
221240func IndexOf [T comparable ](a []T , x T ) int {
222- for i , y := range a {
223- if x == y {
224- return i
225- }
226- }
227- return - 1
241+ return slices .Index (a , x )
228242}
229243
230244/* Contains
@@ -234,7 +248,7 @@ func IndexOf[T comparable](a []T, x T) int {
234248* fmt.Println(b) // true
235249 */
236250func Contains [T comparable ](a []T , x T ) bool {
237- return IndexOf (a , x ) != - 1
251+ return slices . Contains (a , x )
238252}
239253
240254/* Equals
@@ -247,15 +261,7 @@ func Contains[T comparable](a []T, x T) bool {
247261 */
248262
249263func Equals [T comparable ](a , b []T ) bool {
250- if len (a ) != len (b ) {
251- return false
252- }
253- for i , x := range a {
254- if x != b [i ] {
255- return false
256- }
257- }
258- return true
264+ return slices .Equal (a , b )
259265}
260266
261267/* Reverse
@@ -266,9 +272,8 @@ func Equals[T comparable](a, b []T) bool {
266272 */
267273func Reverse [T any ](a []T ) []T {
268274 b := make ([]T , len (a ))
269- for i , x := range a {
270- b [len (a )- 1 - i ] = x
271- }
275+ copy (b , a )
276+ slices .Reverse (b )
272277 return b
273278}
274279
@@ -279,12 +284,11 @@ func Reverse[T any](a []T) []T {
279284* fmt.Println(b) // [2 5 4 3 1]
280285 */
281286func Shuffle [T any ](a []T ) []T {
282- r := rand .New (rand .NewSource (time .Now ().UnixNano ()))
283287 b := make ([]T , len (a ))
284- perm := r . Perm ( len ( a ) )
285- for i , j := range perm {
286- b [i ] = a [ j ]
287- }
288+ copy ( b , a )
289+ rand . Shuffle ( len ( b ), func ( i , j int ) {
290+ b [i ], b [ j ] = b [ j ], b [ i ]
291+ })
288292 return b
289293}
290294
@@ -297,10 +301,13 @@ func Shuffle[T any](a []T) []T {
297301
298302func Unique [T comparable ](a []T ) []T {
299303 b := make ([]T , 0 , len (a ))
304+ seen := make (map [T ]struct {}, len (a ))
300305 for _ , x := range a {
301- if ! Contains ( b , x ) {
302- b = append ( b , x )
306+ if _ , ok := seen [ x ]; ok {
307+ continue
303308 }
309+ seen [x ] = struct {}{}
310+ b = append (b , x )
304311 }
305312 return b
306313}
@@ -313,8 +320,15 @@ func Unique[T comparable](a []T) []T {
313320* fmt.Println(c) // [1 2 3 4 5 6 7 8 9 10]
314321 */
315322
316- func Union [T comparable ](a , b []T ) []T {
317- return append (a , b ... )
323+ func Union [T any ](a , b []T ) []T {
324+ if len (a )+ len (b ) == 0 {
325+ return append (a , b ... )
326+ }
327+
328+ c := make ([]T , 0 , len (a )+ len (b ))
329+ c = append (c , a ... )
330+ c = append (c , b ... )
331+ return c
318332}
319333
320334/* Fill
@@ -431,9 +445,8 @@ func Unshift[T any](a []T, x ...T) []T {
431445func GroupBy [T any , K comparable ](w []T , key func (T ) K ) map [K ][]T {
432446 m := make (map [K ][]T )
433447 for _ , x := range w {
434- if _ , ok := m [key (x )]; ! ok {
435- m [key (x )] = make ([]T , 0 )
436- }
448+ k := key (x )
449+ m [k ] = append (m [k ], x )
437450 }
438451
439452 return m
0 commit comments