diff --git a/slice/slice.go b/slice/slice.go index 7772f54..69f553a 100644 --- a/slice/slice.go +++ b/slice/slice.go @@ -42,29 +42,18 @@ func Chunk[T any](slice []T, size int) [][]T { return result } - length := len(slice) - if size == 1 || size >= length { - for _, v := range slice { - var tmp []T - tmp = append(tmp, v) - result = append(result, tmp) + for _, item := range slice { + l := len(result) + if l == 0 || len(result[l-1]) == size { + result = append(result, []T{}) + l++ } - return result - } - // divide slice equally - divideNum := length/size + 1 - for i := 0; i < divideNum; i++ { - if i == divideNum-1 { - if len(slice[i*size:]) > 0 { - result = append(result, slice[i*size:]) - } - } else { - result = append(result, slice[i*size:(i+1)*size]) - } + result[l-1] = append(result[l-1], item) } return result + } // Compact creates an slice with all falsey values removed. The values false, nil, 0, and "" are falsey diff --git a/slice/slice_test.go b/slice/slice_test.go index 51e70df..2d5b793 100644 --- a/slice/slice_test.go +++ b/slice/slice_test.go @@ -31,6 +31,10 @@ func TestChunk(t *testing.T) { arr := []string{"a", "b", "c", "d", "e"} + assert.Equal([][]string{}, Chunk(arr, -1)) + + assert.Equal([][]string{}, Chunk(arr, 0)) + r1 := [][]string{{"a"}, {"b"}, {"c"}, {"d"}, {"e"}} assert.Equal(r1, Chunk(arr, 1)) @@ -43,8 +47,11 @@ func TestChunk(t *testing.T) { r4 := [][]string{{"a", "b", "c", "d"}, {"e"}} assert.Equal(r4, Chunk(arr, 4)) - r5 := [][]string{{"a"}, {"b"}, {"c"}, {"d"}, {"e"}} + r5 := [][]string{{"a", "b", "c", "d", "e"}} assert.Equal(r5, Chunk(arr, 5)) + + r6 := [][]string{{"a", "b", "c", "d", "e"}} + assert.Equal(r6, Chunk(arr, 6)) } func TestCompact(t *testing.T) {