1
0
mirror of https://github.com/duke-git/lancet.git synced 2026-02-06 21:52:28 +08:00

feat: add Drop func

This commit is contained in:
dudaodong
2022-01-01 17:20:41 +08:00
parent c625a88067
commit b42aac53b3
2 changed files with 55 additions and 0 deletions

View File

@@ -7,6 +7,7 @@ package slice
import (
"errors"
"fmt"
"math"
"reflect"
"sort"
"strings"
@@ -332,6 +333,37 @@ func DeleteByIndex(slice interface{}, start int, end ...int) (interface{}, error
return v.Interface(), nil
}
// Drop creates a slice with `n` elements dropped from the beginning when n > 0, or `n` elements dropped from the ending when n < 0
func Drop(slice interface{}, n int) interface{} {
sv := sliceValue(slice)
if n == 0 {
return slice
}
svLen := sv.Len()
if math.Abs(float64(n)) >= float64(svLen) {
return reflect.MakeSlice(sv.Type(), 0, 0).Interface()
}
if n > 0 {
res := reflect.MakeSlice(sv.Type(), svLen-n, svLen-n)
for i := 0; i < res.Len(); i++ {
res.Index(i).Set(sv.Index(i + n))
}
return res.Interface()
} else {
res := reflect.MakeSlice(sv.Type(), svLen+n, svLen+n)
for i := 0; i < res.Len(); i++ {
res.Index(i).Set(sv.Index(i))
}
return res.Interface()
}
}
// InsertByIndex insert the element into slice at index.
// Insert value: s = append(s[:i], append([]T{x}, s[i:]...)...)
// Insert slice: a = append(a[:i], append(b, a[i:]...)...)

View File

@@ -326,6 +326,29 @@ func deleteByIndex(t *testing.T, origin, test interface{}, start, end int, expec
}
}
func TestDrop(t *testing.T) {
drop(t, []int{}, 0, []int{})
drop(t, []int{}, 1, []int{})
drop(t, []int{}, -1, []int{})
drop(t, []int{1, 2, 3, 4, 5}, 0, []int{1, 2, 3, 4, 5})
drop(t, []int{1, 2, 3, 4, 5}, 1, []int{2, 3, 4, 5})
drop(t, []int{1, 2, 3, 4, 5}, 5, []int{})
drop(t, []int{1, 2, 3, 4, 5}, 6, []int{})
drop(t, []int{1, 2, 3, 4, 5}, -1, []int{1, 2, 3, 4})
drop(t, []int{1, 2, 3, 4, 5}, -5, []int{})
drop(t, []int{1, 2, 3, 4, 5}, -6, []int{})
}
func drop(t *testing.T, test interface{}, n int, expected interface{}) {
res := Drop(test, n)
if !reflect.DeepEqual(res, expected) {
internal.LogFailedTestInfo(t, "Drop", test, expected, res)
t.FailNow()
}
}
func TestInsertByIndex(t *testing.T) {
t1 := []string{"a", "b", "c"}