mirror of https://github.com/hashicorp/consul
97 lines
1.9 KiB
Go
97 lines
1.9 KiB
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: BUSL-1.1
|
|
|
|
package stringslice
|
|
|
|
// StrContains => Contains
|
|
// StringSliceEqual => Equal
|
|
// StringSliceMergeSorted => MergeSorted
|
|
|
|
// Contains checks if a list contains a string
|
|
func Contains(l []string, s string) bool {
|
|
for _, v := range l {
|
|
if v == s {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// Equal compares two string slices for equality. Both the existence
|
|
// of the elements and the order of those elements matter for equality. Empty
|
|
// slices are treated identically to nil slices.
|
|
func Equal(a, b []string) bool {
|
|
if len(a) != len(b) {
|
|
return false
|
|
}
|
|
|
|
for i := 0; i < len(a); i++ {
|
|
if a[i] != b[i] {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
// MergeSorted takes two string slices that are assumed to be sorted
|
|
// and does a zipper merge of the two sorted slices, removing any cross-slice
|
|
// duplicates. If any individual slice contained duplicates those will be
|
|
// retained.
|
|
func MergeSorted(a, b []string) []string {
|
|
if len(a) == 0 && len(b) == 0 {
|
|
return nil
|
|
} else if len(a) == 0 {
|
|
return b
|
|
} else if len(b) == 0 {
|
|
return a
|
|
}
|
|
|
|
out := make([]string, 0, len(a)+len(b))
|
|
|
|
i, j := 0, 0
|
|
for i < len(a) && j < len(b) {
|
|
switch {
|
|
case a[i] < b[j]:
|
|
out = append(out, a[i])
|
|
i++
|
|
case a[i] > b[j]:
|
|
out = append(out, b[j])
|
|
j++
|
|
default:
|
|
out = append(out, a[i])
|
|
i++
|
|
j++
|
|
}
|
|
}
|
|
if i < len(a) {
|
|
out = append(out, a[i:]...)
|
|
}
|
|
if j < len(b) {
|
|
out = append(out, b[j:]...)
|
|
}
|
|
return out
|
|
}
|
|
|
|
func CloneStringSlice(s []string) []string {
|
|
if len(s) == 0 {
|
|
return nil
|
|
}
|
|
out := make([]string, len(s))
|
|
copy(out, s)
|
|
return out
|
|
}
|
|
|
|
// EqualMapKeys returns true if the slice equals the keys of
|
|
// the map ignoring any ordering.
|
|
func EqualMapKeys[V any](a []string, b map[string]V) bool {
|
|
if len(a) != len(b) {
|
|
return false
|
|
}
|
|
for _, ip := range a {
|
|
if _, ok := b[ip]; !ok {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|