|
package utils |
|
|
|
import ( |
|
"strings" |
|
|
|
"github.com/pkg/errors" |
|
) |
|
|
|
|
|
func SliceEqual[T comparable](a, b []T) bool { |
|
if len(a) != len(b) { |
|
return false |
|
} |
|
for i, v := range a { |
|
if v != b[i] { |
|
return false |
|
} |
|
} |
|
return true |
|
} |
|
|
|
|
|
func SliceContains[T comparable](arr []T, v T) bool { |
|
for _, vv := range arr { |
|
if vv == v { |
|
return true |
|
} |
|
} |
|
return false |
|
} |
|
|
|
|
|
func SliceAllContains[T comparable](arr []T, vs ...T) bool { |
|
vsMap := make(map[T]struct{}) |
|
for _, v := range arr { |
|
vsMap[v] = struct{}{} |
|
} |
|
for _, v := range vs { |
|
if _, ok := vsMap[v]; !ok { |
|
return false |
|
} |
|
} |
|
return true |
|
} |
|
|
|
|
|
func SliceConvert[S any, D any](srcS []S, convert func(src S) (D, error)) ([]D, error) { |
|
res := make([]D, 0, len(srcS)) |
|
for i := range srcS { |
|
dst, err := convert(srcS[i]) |
|
if err != nil { |
|
return nil, err |
|
} |
|
res = append(res, dst) |
|
} |
|
return res, nil |
|
} |
|
|
|
func MustSliceConvert[S any, D any](srcS []S, convert func(src S) D) []D { |
|
res := make([]D, 0, len(srcS)) |
|
for i := range srcS { |
|
dst := convert(srcS[i]) |
|
res = append(res, dst) |
|
} |
|
return res |
|
} |
|
|
|
func MergeErrors(errs ...error) error { |
|
errStr := strings.Join(MustSliceConvert(errs, func(err error) string { |
|
return err.Error() |
|
}), "\n") |
|
if errStr != "" { |
|
return errors.New(errStr) |
|
} |
|
return nil |
|
} |
|
|
|
func SliceMeet[T1, T2 any](arr []T1, v T2, meet func(item T1, v T2) bool) bool { |
|
for _, item := range arr { |
|
if meet(item, v) { |
|
return true |
|
} |
|
} |
|
return false |
|
} |
|
|
|
func SliceFilter[T any](arr []T, filter func(src T) bool) []T { |
|
res := make([]T, 0, len(arr)) |
|
for _, src := range arr { |
|
if filter(src) { |
|
res = append(res, src) |
|
} |
|
} |
|
return res |
|
} |
|
|
|
func SliceReplace[T any](arr []T, replace func(src T) T) { |
|
for i, src := range arr { |
|
arr[i] = replace(src) |
|
} |
|
} |
|
|