mirror of
https://github.com/coder/coder.git
synced 2025-07-03 16:13:58 +00:00
* chore: Allow RecordingAuthorizer to record multiple rbac authz calls Prior iteration only recorded the last call. This is required for more comprehensive testing
70 lines
1.5 KiB
Go
70 lines
1.5 KiB
Go
package slice
|
|
|
|
// New is a convenience method for creating []T.
|
|
func New[T any](items ...T) []T {
|
|
return items
|
|
}
|
|
|
|
// SameElements returns true if the 2 lists have the same elements in any
|
|
// order.
|
|
func SameElements[T comparable](a []T, b []T) bool {
|
|
if len(a) != len(b) {
|
|
return false
|
|
}
|
|
|
|
for _, element := range a {
|
|
if !Contains(b, element) {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func ContainsCompare[T any](haystack []T, needle T, equal func(a, b T) bool) bool {
|
|
for _, hay := range haystack {
|
|
if equal(needle, hay) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func Contains[T comparable](haystack []T, needle T) bool {
|
|
return ContainsCompare(haystack, needle, func(a, b T) bool {
|
|
return a == b
|
|
})
|
|
}
|
|
|
|
// Overlap returns if the 2 sets have any overlap (element(s) in common)
|
|
func Overlap[T comparable](a []T, b []T) bool {
|
|
return OverlapCompare(a, b, func(a, b T) bool {
|
|
return a == b
|
|
})
|
|
}
|
|
|
|
// Unique returns a new slice with all duplicate elements removed.
|
|
// This is a slow function on large lists.
|
|
// TODO: Sort elements and implement a faster search algorithm if we
|
|
// really start to use this.
|
|
func Unique[T comparable](a []T) []T {
|
|
cpy := make([]T, 0, len(a))
|
|
for _, v := range a {
|
|
v := v
|
|
if !Contains(cpy, v) {
|
|
cpy = append(cpy, v)
|
|
}
|
|
}
|
|
return cpy
|
|
}
|
|
|
|
func OverlapCompare[T any](a []T, b []T, equal func(a, b T) bool) bool {
|
|
// For each element in b, if at least 1 is contained in 'a',
|
|
// return true.
|
|
for _, element := range b {
|
|
if ContainsCompare(a, element, equal) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|