Skip to content

Commit

Permalink
Add slice Insert & InsertSlice, Inserts an element or multiple elemen…
Browse files Browse the repository at this point in the history
…ts at index i.
  • Loading branch information
wenlingang committed Aug 3, 2023
1 parent 2a74434 commit fc58c98
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 2 deletions.
24 changes: 24 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,8 @@ Supported helpers for slices:
- [Compact](#compact)
- [IsSorted](#issorted)
- [IsSortedByKey](#issortedbykey)
- [Insert](#insert)
- [InsertSlice](#insertslice)

Supported helpers for maps:

Expand Down Expand Up @@ -923,6 +925,28 @@ slice := lo.IsSortedByKey([]string{"a", "bb", "ccc"}, func(s string) int {

[[play](https://go.dev/play/p/wiG6XyBBu49)]

### Insert

Inserts an element at index i.

```go
result := lo.Insert(["a", "c", "d"], 1, "b")
// []string{"a", "b", "c", "d"}
```

[[play](https://go.dev/play/p/Eu3pk6_ODVQ)]

### InsertSlice

Inserts multiple elements at index i.

```go
result := lo.InsertSlice([]string{"a", "d"}, 1, []string{"b", "c"})
// []string{"a", "b", "c", "d"}
```

[[play](https://go.dev/play/p/8gXdkTovsIC)]

### Keys

Creates an array of the map keys.
Expand Down
22 changes: 22 additions & 0 deletions slice.go
Original file line number Diff line number Diff line change
Expand Up @@ -592,3 +592,25 @@ func IsSortedByKey[T any, K constraints.Ordered](collection []T, iteratee func(i

return true
}

// Insert inserts an element at index i.
// Play: https://go.dev/play/p/Eu3pk6_ODVQ
func Insert[T any](collection []T, i int, element T) []T {
result := make([]T, len(collection)+1)
copy(result, collection[:i])
result[i] = element
copy(result[i+1:], collection[i:])

return result
}

// InsertSlice inserts multiple elements at index i.
// Play: https://go.dev/play/p/8gXdkTovsIC
func InsertSlice[T any](collection []T, i int, elements []T) []T {
result := make([]T, len(collection)+len(elements))
copy(result, collection[:i])
copy(result[i:], elements)
copy(result[i+len(elements):], collection[i:])

return result
}
26 changes: 24 additions & 2 deletions slice_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -388,7 +388,7 @@ func TestAssociate(t *testing.T) {

func TestSliceToMap(t *testing.T) {
t.Parallel()

type foo struct {
baz string
bar int
Expand Down Expand Up @@ -626,7 +626,7 @@ func TestSlice(t *testing.T) {
out16 := Slice(in, -10, 1)
out17 := Slice(in, -1, 3)
out18 := Slice(in, -10, 7)

is.Equal([]int{}, out1)
is.Equal([]int{0}, out2)
is.Equal([]int{0, 1, 2, 3, 4}, out3)
Expand Down Expand Up @@ -759,3 +759,25 @@ func TestIsSortedByKey(t *testing.T) {
return ret
}))
}

func TestInsert(t *testing.T) {
t.Parallel()
is := assert.New(t)

inserts := Insert([]string{"a", "c", "d"}, 1, "b")
is.True(len(inserts) == 4 && inserts[1] == "b")

inserti := Insert([]int{1, 3, 4}, 1, 2)
is.True(len(inserti) == 4 && inserti[1] == 2)
}

func TestInsertSlice(t *testing.T) {
t.Parallel()
is := assert.New(t)

inserts := InsertSlice([]string{"a", "d"}, 1, []string{"b", "c"})
is.True(len(inserts) == 4 && inserts[1] == "b" && inserts[2] == "c")

inserti := InsertSlice([]int{1, 4}, 1, []int{2, 3})
is.True(len(inserti) == 4 && inserti[1] == 2 && inserti[2] == 3)
}

0 comments on commit fc58c98

Please sign in to comment.