Skip to content

Commit 4f02db2

Browse files
rjNemoclaude
andauthored
feat: add Intersperse function (#46)
- Add Intersperse: inserts separator between each element - Pre-allocated for optimal performance - Comprehensive tests including edge cases - Benchmark included Example: Intersperse([1,2,3], 0) → [1,0,2,0,3] Resolves Issue 18 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude <noreply@anthropic.com>
1 parent 260c48e commit 4f02db2

File tree

2 files changed

+83
-0
lines changed

2 files changed

+83
-0
lines changed

intersperse.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package underscore
2+
3+
// Intersperse inserts a separator between each element of the slice.
4+
// Returns an empty slice if the input is empty.
5+
// Returns the original element if the input has only one element.
6+
//
7+
// Example: Intersperse([]int{1,2,3}, 0) → [1, 0, 2, 0, 3]
8+
func Intersperse[T any](values []T, separator T) []T {
9+
if len(values) == 0 {
10+
return []T{}
11+
}
12+
if len(values) == 1 {
13+
return []T{values[0]}
14+
}
15+
16+
// Result will have len(values) + (len(values)-1) elements
17+
res := make([]T, 0, len(values)*2-1)
18+
res = append(res, values[0])
19+
for i := 1; i < len(values); i++ {
20+
res = append(res, separator, values[i])
21+
}
22+
return res
23+
}

intersperse_test.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package underscore_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
8+
u "github.com/rjNemo/underscore"
9+
)
10+
11+
func TestIntersperse(t *testing.T) {
12+
nums := []int{1, 2, 3, 4, 5}
13+
result := u.Intersperse(nums, 0)
14+
assert.Equal(t, []int{1, 0, 2, 0, 3, 0, 4, 0, 5}, result)
15+
}
16+
17+
func TestIntersperseEmpty(t *testing.T) {
18+
result := u.Intersperse([]int{}, 0)
19+
assert.Equal(t, []int{}, result)
20+
}
21+
22+
func TestIntersperseSingleElement(t *testing.T) {
23+
result := u.Intersperse([]int{42}, 0)
24+
assert.Equal(t, []int{42}, result)
25+
}
26+
27+
func TestIntersperseTwoElements(t *testing.T) {
28+
result := u.Intersperse([]int{1, 2}, 0)
29+
assert.Equal(t, []int{1, 0, 2}, result)
30+
}
31+
32+
func TestIntersperseStrings(t *testing.T) {
33+
words := []string{"hello", "world", "!"}
34+
result := u.Intersperse(words, ",")
35+
assert.Equal(t, []string{"hello", ",", "world", ",", "!"}, result)
36+
}
37+
38+
func TestIntersperseComma(t *testing.T) {
39+
words := []string{"apple", "banana", "cherry"}
40+
result := u.Intersperse(words, ",")
41+
assert.Equal(t, []string{"apple", ",", "banana", ",", "cherry"}, result)
42+
}
43+
44+
func TestIntersperseNegativeNumber(t *testing.T) {
45+
nums := []int{1, 2, 3}
46+
result := u.Intersperse(nums, -1)
47+
assert.Equal(t, []int{1, -1, 2, -1, 3}, result)
48+
}
49+
50+
func BenchmarkIntersperse(b *testing.B) {
51+
nums := make([]int, 100)
52+
for i := range nums {
53+
nums[i] = i
54+
}
55+
56+
b.ResetTimer()
57+
for i := 0; i < b.N; i++ {
58+
u.Intersperse(nums, 0)
59+
}
60+
}

0 commit comments

Comments
 (0)