You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
2.6 KiB
Go
131 lines
2.6 KiB
Go
1 year ago
|
package narr
|
||
|
|
||
|
import (
|
||
|
"git.noahlan.cn/noahlan/ntool/ndef"
|
||
|
"git.noahlan.cn/noahlan/ntool/nrandom"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
// Reverse string slice [site user info 0] -> [0 info user site]
|
||
|
func Reverse(ss []string) {
|
||
|
ln := len(ss)
|
||
|
for i := 0; i < ln/2; i++ {
|
||
|
li := ln - i - 1
|
||
|
ss[i], ss[li] = ss[li], ss[i]
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// StringsRemove a value form a string slice
|
||
|
func StringsRemove(ss []string, s string) []string {
|
||
|
ns := make([]string, 0, len(ss))
|
||
|
for _, v := range ss {
|
||
|
if v != s {
|
||
|
ns = append(ns, v)
|
||
|
}
|
||
|
}
|
||
|
return ns
|
||
|
}
|
||
|
|
||
|
// StringsFilter given strings, default will filter emtpy string.
|
||
|
//
|
||
|
// Usage:
|
||
|
//
|
||
|
// // output: [a, b]
|
||
|
// ss := narr.StringsFilter([]string{"a", "", "b", ""})
|
||
|
func StringsFilter(ss []string, filter ...func(s string) bool) []string {
|
||
|
var fn func(s string) bool
|
||
|
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 := narr.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) }
|
||
|
|
||
|
// RandomOne get random element from an array/slice
|
||
|
func RandomOne[T any](arr []T) T {
|
||
|
if ln := len(arr); ln > 0 {
|
||
|
i := nrandom.RandInt(0, len(arr))
|
||
|
return arr[i]
|
||
|
}
|
||
|
panic("cannot get value from nil or empty slice")
|
||
|
}
|
||
|
|
||
|
// Unique value in the given slice data.
|
||
|
func Unique[T ~string | ndef.XIntOrFloat](list []T) []T {
|
||
|
if len(list) < 2 {
|
||
|
return list
|
||
|
}
|
||
|
|
||
|
valMap := make(map[T]struct{}, len(list))
|
||
|
uniArr := make([]T, 0, len(list))
|
||
|
|
||
|
for _, t := range list {
|
||
|
if _, ok := valMap[t]; !ok {
|
||
|
valMap[t] = struct{}{}
|
||
|
uniArr = append(uniArr, t)
|
||
|
}
|
||
|
}
|
||
|
return uniArr
|
||
|
}
|
||
|
|
||
|
// IndexOf value in given slice.
|
||
|
func IndexOf[T ~string | ndef.XIntOrFloat](val T, list []T) int {
|
||
|
for i, v := range list {
|
||
|
if v == val {
|
||
|
return i
|
||
|
}
|
||
|
}
|
||
|
return -1
|
||
|
}
|