-
Notifications
You must be signed in to change notification settings - Fork 2.8k
/
set.go
30 lines (28 loc) · 826 Bytes
/
set.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// SPDX-License-Identifier: Apache-2.0
// Copyright Authors of Cilium
package set
// SliceSubsetOf checks whether the first slice is a subset of the second slice. If
// not, it also returns slice of elements which are the difference of both
// input slices.
func SliceSubsetOf(sub, main []string) (bool, []string) {
var diff []string
occurrences := make(map[string]int, len(main))
result := true
for _, element := range main {
occurrences[element]++
}
for _, element := range sub {
if count, ok := occurrences[element]; !ok {
// Element was not found in the main slice.
result = false
diff = append(diff, element)
} else if count < 1 {
// The element is in both slices, but the sub slice
// has more duplicates.
result = false
} else {
occurrences[element]--
}
}
return result, diff
}