stash/pkg/utils/collections.go

61 lines
1.0 KiB
Go
Raw Normal View History

package utils
import "reflect"
// SliceSame returns true if the two provided lists have the same elements,
// regardless of order. Panics if either parameter is not a slice.
func SliceSame(a, b interface{}) bool {
v1 := reflect.ValueOf(a)
v2 := reflect.ValueOf(b)
if (v1.IsValid() && v1.Kind() != reflect.Slice) || (v2.IsValid() && v2.Kind() != reflect.Slice) {
panic("not a slice")
}
v1Len := 0
v2Len := 0
v1Valid := v1.IsValid()
v2Valid := v2.IsValid()
if v1Valid {
v1Len = v1.Len()
}
if v2Valid {
v2Len = v2.Len()
}
if !v1Valid || !v2Valid {
return v1Len == v2Len
}
if v1Len != v2Len {
return false
}
if v1.Type() != v2.Type() {
return false
}
visited := make(map[int]bool)
for i := 0; i < v1.Len(); i++ {
found := false
for j := 0; j < v2.Len(); j++ {
if visited[j] {
continue
}
if reflect.DeepEqual(v1.Index(i).Interface(), v2.Index(j).Interface()) {
found = true
visited[j] = true
break
}
}
if !found {
return false
}
}
return true
}