Skip to content

Commit a22c8b9

Browse files
AlexamakansAlexander Fougner
and
Alexander Fougner
authored
fix: slices.Fold and slices.FoldReverse (#40)
* Fix slices.Fold and slices.FoldReverse * Add tests for slices.Fold and slices.FoldReverse * Update CHANGELOG.md * 'nil' -> 'nil slice' * update .github/workflows/go-format.yml? --------- Co-authored-by: Alexander Fougner <alexander.fougner@iver.se>
1 parent 1d87ed4 commit a22c8b9

File tree

4 files changed

+72
-4
lines changed

4 files changed

+72
-4
lines changed

.github/workflows/go-format.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ jobs:
1717
steps:
1818
- uses: actions/setup-go@v2
1919
with:
20-
go-version: '1.18'
20+
go-version: '1.23'
2121

2222
- name: Install goimports
2323
run: go install golang.org/x/tools/cmd/goimports@latest

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ SPDX-License-Identifier: CC-BY-4.0
1010

1111
This project tries to follow [SemVer 2.0.0](https://semver.org/).
1212

13+
## v4.3.1 (WIP)
14+
15+
- Fixed `slices.Fold` and `slices.FoldReverse` bugs. (#39)
16+
1317
## v4.3.0 (2023-05-04)
1418

1519
- Added `sync2.Map.Len()` method. (#38)

slices/slices.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ func Filter[S ~[]E, E any](slice S, match func(value E) bool) S {
272272
func Fold[S ~[]E, State, E any](slice S, seed State, acc func(state State, value E) State) State {
273273
state := seed
274274
for _, v := range slice {
275-
seed = acc(state, v)
275+
state = acc(state, v)
276276
}
277277
return state
278278
}
@@ -282,8 +282,8 @@ func Fold[S ~[]E, State, E any](slice S, seed State, acc func(state State, value
282282
// seed value as-is if the slice is empty.
283283
func FoldReverse[S ~[]E, State, E any](slice S, seed State, acc func(state State, value E) State) State {
284284
state := seed
285-
for i := len(slice) - 1; i >= 0; i++ {
286-
seed = acc(state, slice[i])
285+
for i := len(slice) - 1; i >= 0; i-- {
286+
state = acc(state, slice[i])
287287
}
288288
return state
289289
}

slices/slices_test.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,70 @@ func TestRemoveSlice(t *testing.T) {
188188
}
189189
}
190190

191+
func TestFold(t *testing.T) {
192+
testCases := []struct {
193+
name string
194+
slice []string
195+
seed string
196+
want string
197+
}{
198+
{
199+
name: "values",
200+
slice: []string{"a", "b", "c"},
201+
seed: "",
202+
want: "abc",
203+
},
204+
{
205+
name: "nil slice",
206+
slice: nil,
207+
seed: "seed",
208+
want: "seed",
209+
},
210+
}
211+
for _, tc := range testCases {
212+
t.Run(tc.name, func(t *testing.T) {
213+
gotStr := Fold(tc.slice, tc.seed, func(state string, seed string) string {
214+
return state + seed
215+
})
216+
if gotStr != tc.want {
217+
t.Errorf("want %q, got %q", tc.want, gotStr)
218+
}
219+
})
220+
}
221+
}
222+
223+
func TestFoldReverse(t *testing.T) {
224+
testCases := []struct {
225+
name string
226+
slice []string
227+
seed string
228+
want string
229+
}{
230+
{
231+
name: "values",
232+
slice: []string{"a", "b", "c"},
233+
seed: "",
234+
want: "cba",
235+
},
236+
{
237+
name: "nil slice",
238+
slice: nil,
239+
seed: "seed",
240+
want: "seed",
241+
},
242+
}
243+
for _, tc := range testCases {
244+
t.Run(tc.name, func(t *testing.T) {
245+
gotStr := FoldReverse(tc.slice, tc.seed, func(state string, seed string) string {
246+
return state + seed
247+
})
248+
if gotStr != tc.want {
249+
t.Errorf("want %q, got %q", tc.want, gotStr)
250+
}
251+
})
252+
}
253+
}
254+
191255
func TestConcat(t *testing.T) {
192256
testCases := []struct {
193257
a string

0 commit comments

Comments
 (0)