diff --git a/arrutil/arrutil.go b/arrutil/arrutil.go index 70ce087d5..583435696 100644 --- a/arrutil/arrutil.go +++ b/arrutil/arrutil.go @@ -2,82 +2,9 @@ package arrutil import ( - "strings" - - "github.com/gookit/goutil/comdef" "github.com/gookit/goutil/mathutil" ) -// StringsRemove value form a string slice -func StringsRemove(ss []string, s string) []string { - return StringsFilter(ss, func(el string) bool { - return s != el - }) -} - -// StringsFilter given strings, default will filter emtpy string. -// -// Usage: -// -// // output: [a, b] -// ss := arrutil.StringsFilter([]string{"a", "", "b", ""}) -func StringsFilter(ss []string, filter ...comdef.StringMatchFunc) []string { - var fn comdef.StringMatchFunc - if len(filter) > 0 && filter[0] != nil { - fn = filter[0] - } else { - fn = func(s string) bool { - return s != "" - } - } - - ns := make([]string, 0, len(ss)) - for _, s := range ss { - if fn(s) { - ns = append(ns, s) - } - } - return ns -} - -// StringsMap handle each string item, map to new strings -func StringsMap(ss []string, mapFn func(s string) string) []string { - ns := make([]string, 0, len(ss)) - for _, s := range ss { - ns = append(ns, mapFn(s)) - } - return ns -} - -// TrimStrings trim string slice item. -// -// Usage: -// -// // output: [a, b, c] -// ss := arrutil.TrimStrings([]string{",a", "b.", ",.c,"}, ",.") -func TrimStrings(ss []string, cutSet ...string) []string { - cutSetLn := len(cutSet) - hasCutSet := cutSetLn > 0 && cutSet[0] != "" - - var trimSet string - if hasCutSet { - trimSet = cutSet[0] - } - if cutSetLn > 1 { - trimSet = strings.Join(cutSet, "") - } - - ns := make([]string, 0, len(ss)) - for _, str := range ss { - if hasCutSet { - ns = append(ns, strings.Trim(str, trimSet)) - } else { - ns = append(ns, strings.TrimSpace(str)) - } - } - return ns -} - // GetRandomOne get random element from an array/slice func GetRandomOne[T any](arr []T) T { return RandomOne(arr) } diff --git a/arrutil/arrutil_test.go b/arrutil/arrutil_test.go index 57465f7b2..3c235cfd0 100644 --- a/arrutil/arrutil_test.go +++ b/arrutil/arrutil_test.go @@ -1,50 +1,12 @@ package arrutil_test import ( - "fmt" "testing" "github.com/gookit/goutil/arrutil" "github.com/gookit/goutil/testutil/assert" ) -func TestStringsRemove(t *testing.T) { - ss := []string{"a", "b", "c"} - ns := arrutil.StringsRemove(ss, "b") - - assert.Contains(t, ns, "a") - assert.NotContains(t, ns, "b") - assert.Len(t, ns, 2) -} - -func TestStringsFilter(t *testing.T) { - is := assert.New(t) - - ss := arrutil.StringsFilter([]string{"a", "", "b", ""}) - is.Eq([]string{"a", "b"}, ss) -} - -func TestStringsMap(t *testing.T) { - is := assert.New(t) - - ss := arrutil.StringsMap([]string{"a", "b", "c"}, func(s string) string { - return s + "1" - }) - is.Eq([]string{"a1", "b1", "c1"}, ss) -} - -func TestTrimStrings(t *testing.T) { - is := assert.New(t) - - // TrimStrings - ss := arrutil.TrimStrings([]string{" a", "b ", " c "}) - is.Eq("[a b c]", fmt.Sprint(ss)) - ss = arrutil.TrimStrings([]string{",a", "b.", ",.c,"}, ",.") - is.Eq("[a b c]", fmt.Sprint(ss)) - ss = arrutil.TrimStrings([]string{",a", "b.", ",.c,"}, ",", ".") - is.Eq("[a b c]", fmt.Sprint(ss)) -} - func TestGetRandomOne(t *testing.T) { is := assert.New(t) // int slice diff --git a/arrutil/strings.go b/arrutil/strings.go index ef3fa6cfd..55968a41f 100644 --- a/arrutil/strings.go +++ b/arrutil/strings.go @@ -1,6 +1,11 @@ package arrutil -import "strconv" +import ( + "strconv" + "strings" + + "github.com/gookit/goutil/comdef" +) // StringsToAnys convert []string to []any func StringsToAnys(ss []string) []any { @@ -39,3 +44,94 @@ func StringsTryInts(ss []string) (ints []int, err error) { } return } + +// StringsUnique unique string slice +func StringsUnique(ss []string) []string { + var unique []string + for _, s := range ss { + if !StringsContains(unique, s) { + unique = append(unique, s) + } + } + return unique +} + +// StringsContains check string slice contains string +func StringsContains(ss []string, s string) bool { + for _, v := range ss { + if v == s { + return true + } + } + return false +} + +// StringsRemove value form a string slice +func StringsRemove(ss []string, s string) []string { + return StringsFilter(ss, func(el string) bool { + return s != el + }) +} + +// StringsFilter given strings, default will filter emtpy string. +// +// Usage: +// +// // output: [a, b] +// ss := arrutil.StringsFilter([]string{"a", "", "b", ""}) +func StringsFilter(ss []string, filter ...comdef.StringMatchFunc) []string { + var fn comdef.StringMatchFunc + if len(filter) > 0 && filter[0] != nil { + fn = filter[0] + } else { + fn = func(s string) bool { + return s != "" + } + } + + ns := make([]string, 0, len(ss)) + for _, s := range ss { + if fn(s) { + ns = append(ns, s) + } + } + return ns +} + +// StringsMap handle each string item, map to new strings +func StringsMap(ss []string, mapFn func(s string) string) []string { + ns := make([]string, 0, len(ss)) + for _, s := range ss { + ns = append(ns, mapFn(s)) + } + return ns +} + +// TrimStrings trim string slice item. +// +// Usage: +// +// // output: [a, b, c] +// ss := arrutil.TrimStrings([]string{",a", "b.", ",.c,"}, ",.") +func TrimStrings(ss []string, cutSet ...string) []string { + cutSetLn := len(cutSet) + hasCutSet := cutSetLn > 0 && cutSet[0] != "" + + var trimSet string + if hasCutSet { + trimSet = cutSet[0] + } + if cutSetLn > 1 { + trimSet = strings.Join(cutSet, "") + } + + ns := make([]string, 0, len(ss)) + for _, str := range ss { + if hasCutSet { + ns = append(ns, strings.Trim(str, trimSet)) + } else { + ns = append(ns, strings.TrimSpace(str)) + } + } + return ns +} diff --git a/arrutil/strings_test.go b/arrutil/strings_test.go index 20db707f1..9dff3384b 100644 --- a/arrutil/strings_test.go +++ b/arrutil/strings_test.go @@ -29,3 +29,40 @@ func TestStringsToInts(t *testing.T) { is.Eq("[]int{1, 2}", fmt.Sprintf("%#v", ints)) is.Nil(arrutil.StringsAsInts([]string{"abc"})) } + +func TestStringsRemove(t *testing.T) { + ss := []string{"a", "b", "c"} + ns := arrutil.StringsRemove(ss, "b") + + assert.Contains(t, ns, "a") + assert.NotContains(t, ns, "b") + assert.Len(t, ns, 2) +} + +func TestStringsFilter(t *testing.T) { + is := assert.New(t) + + ss := arrutil.StringsFilter([]string{"a", "", "b", ""}) + is.Eq([]string{"a", "b"}, ss) +} + +func TestStringsMap(t *testing.T) { + is := assert.New(t) + + ss := arrutil.StringsMap([]string{"a", "b", "c"}, func(s string) string { + return s + "1" + }) + is.Eq([]string{"a1", "b1", "c1"}, ss) +} + +func TestTrimStrings(t *testing.T) { + is := assert.New(t) + + // TrimStrings + ss := arrutil.TrimStrings([]string{" a", "b ", " c "}) + is.Eq("[a b c]", fmt.Sprint(ss)) + ss = arrutil.TrimStrings([]string{",a", "b.", ",.c,"}, ",.") + is.Eq("[a b c]", fmt.Sprint(ss)) + ss = arrutil.TrimStrings([]string{",a", "b.", ",.c,"}, ",", ".") + is.Eq("[a b c]", fmt.Sprint(ss)) +} diff --git a/encodes/hashutil/hashutil_test.go b/encodes/hashutil/hashutil_test.go index ef4a0fdc7..e88aab183 100644 --- a/encodes/hashutil/hashutil_test.go +++ b/encodes/hashutil/hashutil_test.go @@ -3,7 +3,7 @@ package hashutil_test import ( "testing" - "github.com/gookit/goutil/encodx/hashutil" + "github.com/gookit/goutil/encodes/hashutil" "github.com/gookit/goutil/testutil/assert" ) diff --git a/strutil/random.go b/strutil/random.go index 56410baf0..7a00141ad 100644 --- a/strutil/random.go +++ b/strutil/random.go @@ -5,6 +5,7 @@ import ( "time" "github.com/gookit/goutil/byteutil" + "github.com/gookit/goutil/encodes" ) // some consts string chars