Skip to content

Commit 95a0b39

Browse files
committedOct 3, 2024
slices: add reduce functions
1 parent 4408588 commit 95a0b39

File tree

4 files changed

+87
-2
lines changed

4 files changed

+87
-2
lines changed
 

‎go.mod

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/upfluence/pkg
22

3-
go 1.21
3+
go 1.23
44

55
require (
66
github.com/Microsoft/go-winio v0.4.14 // indirect
@@ -34,7 +34,7 @@ require (
3434
github.com/upfluence/stats v0.1.4
3535
github.com/upfluence/thrift v2.4.4+incompatible
3636
golang.org/x/oauth2 v0.19.0
37-
golang.org/x/sync v0.4.0
37+
golang.org/x/sync v0.8.0
3838
golang.org/x/term v0.13.0
3939
golang.org/x/text v0.13.0
4040
golang.org/x/time v0.3.0
@@ -57,6 +57,7 @@ require (
5757
go.uber.org/atomic v1.6.0 // indirect
5858
go.uber.org/multierr v1.5.0 // indirect
5959
golang.org/x/crypto v0.14.0 // indirect
60+
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect
6061
golang.org/x/sys v0.13.0 // indirect
6162
google.golang.org/protobuf v1.31.0 // indirect
6263
gopkg.in/inf.v0 v0.9.1 // indirect

‎go.sum

+4
Original file line numberDiff line numberDiff line change
@@ -513,6 +513,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
513513
golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
514514
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
515515
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
516+
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk=
517+
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY=
516518
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
517519
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
518520
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -560,6 +562,7 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ
560562
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
561563
golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ=
562564
golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
565+
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
563566
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
564567
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
565568
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -617,6 +620,7 @@ golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtn
617620
golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
618621
golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=
619622
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
623+
golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE=
620624
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
621625
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
622626
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

‎slices/reduce.go

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package slices
2+
3+
import "golang.org/x/exp/constraints"
4+
5+
func ReduceWith[S ~[]E, E any, A any](s S, acc A, fn func(A, E) A) A {
6+
for _, e := range s {
7+
acc = fn(acc, e)
8+
}
9+
10+
return acc
11+
}
12+
13+
func Reduce[S ~[]E, E any, A any](s S, fn func(A, E) A) A {
14+
var acc A
15+
16+
return ReduceWith(s, acc, fn)
17+
}
18+
19+
type sumable interface {
20+
constraints.Integer | constraints.Float | ~string
21+
}
22+
23+
func Sum[T sumable](i, j T) T {
24+
return i + j
25+
}

‎slices/reduce_test.go

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package slices
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
func TestReduceWith(t *testing.T) {
10+
for _, tt := range []struct {
11+
slice []int
12+
acc int
13+
fn func(int, int) int
14+
want int
15+
}{
16+
{slice: []int{1, 2, 3}, acc: 0.0, want: 6},
17+
{slice: []int{1, 2, 3}, acc: 1, fn: func(a, b int) int { return a * b }, want: 6},
18+
{slice: []int{}, acc: 0, fn: func(a, b int) int { return a + b }, want: 0},
19+
{slice: []int{1}, acc: 0, fn: func(a, b int) int { return a + b }, want: 1},
20+
} {
21+
got := ReduceWith(tt.slice, tt.acc, tt.fn)
22+
assert.Equal(t, tt.want, got)
23+
}
24+
}
25+
26+
func TestReduce(t *testing.T) {
27+
for _, tt := range []struct {
28+
slice []int
29+
fn func(int, int) int
30+
want int
31+
}{
32+
{slice: []int{1, 2, 3}, fn: func(a, b int) int { return a + b }, want: 6},
33+
{slice: []int{1, 2, 3}, fn: func(a, b int) int { return a * b }, want: 0},
34+
{slice: []int{}, fn: func(a, b int) int { return a + b }, want: 0},
35+
{slice: []int{1}, fn: func(a, b int) int { return a + b }, want: 1},
36+
} {
37+
got := Reduce(tt.slice, tt.fn)
38+
assert.Equal(t, tt.want, got)
39+
}
40+
}
41+
42+
func TestSum(t *testing.T) {
43+
t.Run("integer", func(t *testing.T) {
44+
assert.Equal(t, Reduce([]int{1, 2}, Sum), 3)
45+
assert.Equal(t, ReduceWith([]int{1, 2}, 22, Sum), 25)
46+
})
47+
t.Run("float", func(t *testing.T) {
48+
assert.Equal(t, Reduce([]float64{1.1, 2.3}, Sum), 3.4)
49+
assert.Equal(t, ReduceWith([]float64{1.1, 2.2}, 22.22, Sum), 25.52)
50+
})
51+
t.Run("string", func(t *testing.T) {
52+
assert.Equal(t, Reduce([]string{"foo", "bar"}, Sum), "foobar")
53+
assert.Equal(t, ReduceWith([]string{"foo", "bar"}, "buz", Sum), "buzfoobar")
54+
})
55+
}

0 commit comments

Comments
 (0)