initial import
This commit is contained in:
131
core/stringx/strings.go
Normal file
131
core/stringx/strings.go
Normal file
@@ -0,0 +1,131 @@
|
||||
package stringx
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"zero/core/lang"
|
||||
)
|
||||
|
||||
var (
|
||||
ErrInvalidStartPosition = errors.New("start position is invalid")
|
||||
ErrInvalidStopPosition = errors.New("stop position is invalid")
|
||||
)
|
||||
|
||||
func Contains(list []string, str string) bool {
|
||||
for _, each := range list {
|
||||
if each == str {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func Filter(s string, filter func(r rune) bool) string {
|
||||
var n int
|
||||
chars := []rune(s)
|
||||
for i, x := range chars {
|
||||
if n < i {
|
||||
chars[n] = x
|
||||
}
|
||||
if !filter(x) {
|
||||
n++
|
||||
}
|
||||
}
|
||||
|
||||
return string(chars[:n])
|
||||
}
|
||||
|
||||
func HasEmpty(args ...string) bool {
|
||||
for _, arg := range args {
|
||||
if len(arg) == 0 {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func NotEmpty(args ...string) bool {
|
||||
return !HasEmpty(args...)
|
||||
}
|
||||
|
||||
func Remove(strings []string, strs ...string) []string {
|
||||
out := append([]string(nil), strings...)
|
||||
|
||||
for _, str := range strs {
|
||||
var n int
|
||||
for _, v := range out {
|
||||
if v != str {
|
||||
out[n] = v
|
||||
n++
|
||||
}
|
||||
}
|
||||
out = out[:n]
|
||||
}
|
||||
|
||||
return out
|
||||
}
|
||||
|
||||
func Reverse(s string) string {
|
||||
runes := []rune(s)
|
||||
|
||||
for from, to := 0, len(runes)-1; from < to; from, to = from+1, to-1 {
|
||||
runes[from], runes[to] = runes[to], runes[from]
|
||||
}
|
||||
|
||||
return string(runes)
|
||||
}
|
||||
|
||||
// Substr returns runes between start and stop [start, stop) regardless of the chars are ascii or utf8
|
||||
func Substr(str string, start int, stop int) (string, error) {
|
||||
rs := []rune(str)
|
||||
length := len(rs)
|
||||
|
||||
if start < 0 || start > length {
|
||||
return "", ErrInvalidStartPosition
|
||||
}
|
||||
|
||||
if stop < 0 || stop > length {
|
||||
return "", ErrInvalidStopPosition
|
||||
}
|
||||
|
||||
return string(rs[start:stop]), nil
|
||||
}
|
||||
|
||||
func TakeOne(valid, or string) string {
|
||||
if len(valid) > 0 {
|
||||
return valid
|
||||
} else {
|
||||
return or
|
||||
}
|
||||
}
|
||||
|
||||
func TakeWithPriority(fns ...func() string) string {
|
||||
for _, fn := range fns {
|
||||
val := fn()
|
||||
if len(val) > 0 {
|
||||
return val
|
||||
}
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
func Union(first, second []string) []string {
|
||||
set := make(map[string]lang.PlaceholderType)
|
||||
|
||||
for _, each := range first {
|
||||
set[each] = lang.Placeholder
|
||||
}
|
||||
for _, each := range second {
|
||||
set[each] = lang.Placeholder
|
||||
}
|
||||
|
||||
merged := make([]string, 0, len(set))
|
||||
for k := range set {
|
||||
merged = append(merged, k)
|
||||
}
|
||||
|
||||
return merged
|
||||
}
|
||||
Reference in New Issue
Block a user