coai/utils/base.go
2023-10-21 12:51:47 +08:00

126 lines
2.2 KiB
Go

package utils
import (
"encoding/json"
"fmt"
)
func Contains[T comparable](value T, slice []T) bool {
for _, item := range slice {
if item == value {
return true
}
}
return false
}
func TryGet[T any](arr []T, index int) T {
if index >= len(arr) {
return arr[0]
}
return arr[index]
}
func Debug[T any](v T) T {
fmt.Println(v)
return v
}
func Insert[T any](arr []T, index int, value T) []T {
arr = append(arr, value)
copy(arr[index+1:], arr[index:])
arr[index] = value
return arr
}
func InsertSlice[T any](arr []T, index int, value []T) []T {
arr = append(arr, value...)
copy(arr[index+len(value):], arr[index:])
copy(arr[index:], value)
return arr
}
func Remove[T any](arr []T, index int) []T {
return append(arr[:index], arr[index+1:]...)
}
func RemoveSlice[T any](arr []T, index int, length int) []T {
return append(arr[:index], arr[index+length:]...)
}
func ToJson(value interface{}) string {
if res, err := json.Marshal(value); err == nil {
return string(res)
} else {
return "{}"
}
}
func UnmarshalJson[T any](value string) T {
var res T
if err := json.Unmarshal([]byte(value), &res); err == nil {
return res
} else {
return res
}
}
func DeepCopy[T any](value T) T {
return UnmarshalJson[T](ToJson(value))
}
func GetSegment[T any](arr []T, length int) []T {
if length > len(arr) {
return arr
}
return arr[:length]
}
func GetSegmentString(arr string, length int) string {
if length > len(arr) {
return arr
}
return arr[:length]
}
func GetLatestSegment[T any](arr []T, length int) []T {
if length > len(arr) {
return arr
}
return arr[len(arr)-length:]
}
func Reverse[T any](arr []T) []T {
for i := 0; i < len(arr)/2; i++ {
arr[i], arr[len(arr)-i-1] = arr[len(arr)-i-1], arr[i]
}
return arr
}
func Multi[T comparable](condition bool, tval, fval T) T {
if condition {
return tval
} else {
return fval
}
}
func MultiF[T comparable](condition bool, tval func() T, fval T) T {
if condition {
return tval()
} else {
return fval
}
}
func InsertChannel[T any](ch chan T, value T, index int) {
var arr []T
for i := 0; i < len(ch); i++ {
arr = append(arr, <-ch)
}
arr = Insert(arr, index, value)
for _, v := range arr {
ch <- v
}
}