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

feat: add ToSlice and ToSlicePointer and AppendIfAbsent

This commit is contained in:
dudaodong
2022-07-27 15:12:14 +08:00
parent 683def2242
commit 0cb251f7b8
2 changed files with 66 additions and 21 deletions

View File

@@ -641,7 +641,6 @@ func InsertByIndex(slice interface{}, index int, value interface{}) (interface{}
return slice, errors.New("InvalidSliceIndex")
}
// value is slice
vv := reflect.ValueOf(value)
if vv.Kind() == reflect.Slice {
if reflect.TypeOf(slice).Elem() != reflect.TypeOf(value).Elem() {
@@ -651,7 +650,6 @@ func InsertByIndex(slice interface{}, index int, value interface{}) (interface{}
return v.Interface(), nil
}
// value is not slice
if reflect.TypeOf(slice).Elem() != reflect.TypeOf(value) {
return slice, errors.New("InvalidValueType")
}
@@ -709,21 +707,8 @@ func Unique(slice interface{}) interface{} {
for i := 0; i < len(temp); i++ {
res.Index(i).Set(reflect.ValueOf(temp[i]))
}
return res.Interface()
// if use map filter, the result slice element order is random, not same as origin slice
//mp := make(map[interface{}]bool)
//for i := 0; i < sv.Len(); i++ {
// v := sv.Index(i).Interface()
// mp[v] = true
//}
//
//var res []interface{}
//for k := range mp {
// res = append(res, mp[k])
//}
//return res
}
// UniqueBy call iteratee func with every item of slice, then remove duplicated.
@@ -732,11 +717,6 @@ func UniqueBy(slice, iteratee interface{}) interface{} {
sv := sliceValue(slice)
fn := functionValue(iteratee)
// elemType := sv.Type().Elem()
// if !checkCallbackFuncSignature2(fn, elemType, elemType) {
// panic("iteratee function signature should be of type func(" + elemType.String() + ")" + elemType.String())
// }
if sv.Len() == 0 {
return slice
}
@@ -955,3 +935,36 @@ func LastIndexOf(slice, value interface{}) int {
return -1
}
// ToSlicePointer returns a pointer to the slices of a variable parameter transformation
func ToSlicePointer(value ...interface{}) []*interface{} {
out := make([]*interface{}, len(value))
for i := range value {
out[i] = &value[i]
}
return out
}
// ToSlice returns a slices of a variable parameter transformation
func ToSlice(value ...interface{}) interface{} {
rv := reflect.ValueOf(value)
out := reflect.MakeSlice(rv.Type(), len(value), len(value))
for i := range value {
out.Index(i).Set(reflect.ValueOf(value[i]))
}
return out.Interface()
}
// AppendIfAbsent only absent append the value
func AppendIfAbsent(slice interface{}, value interface{}) interface{} {
sv := sliceValue(slice)
out := reflect.MakeSlice(sv.Type(), sv.Len(), sv.Len())
for i := 0; i < sv.Len(); i++ {
out.Index(i).Set(sv.Index(i))
}
if !Contain(slice, value) {
out = reflect.Append(out, reflect.ValueOf(value))
}
return out.Interface()
}

View File

@@ -592,3 +592,35 @@ func TestLastIndexOf(t *testing.T) {
assert.Equal(1, LastIndexOf(arr, "a"))
assert.Equal(-1, LastIndexOf(arr, "d"))
}
func TestToSlice(t *testing.T) {
assert := internal.NewAssert(t, "TestToSlice")
str1 := "a"
str2 := "b"
out1 := ToSlice(str1)
out2 := ToSlice(str1, str2)
assert.Equal([]string{"a"}, StringSlice(out1))
assert.Equal([]string{"a", "b"}, StringSlice(out2))
}
func TestToSlicePointer(t *testing.T) {
assert := internal.NewAssert(t, "TestToSlicePointer")
var str1 interface{}
str1 = "a"
var str2 interface{}
str2 = "b"
assert.Equal([]*interface{}{&str1}, ToSlicePointer(str1))
assert.Equal([]*interface{}{&str1, &str2}, ToSlicePointer(str1, str2))
}
func TestToAppendIfAbsent(t *testing.T) {
assert := internal.NewAssert(t, "TestToAppendIfAbsent")
str1 := []string{"a", "b"}
assert.Equal([]string{"a", "b"}, AppendIfAbsent(str1, "a"))
assert.Equal([]string{"a", "b", "c"}, AppendIfAbsent(str1, "c"))
}