mirror of https://github.com/portainer/portainer
72 lines
1.2 KiB
Go
72 lines
1.2 KiB
Go
package portainer
|
|
|
|
type tagSet map[TagID]bool
|
|
|
|
// TagSet converts an array of ids to a set
|
|
func TagSet(tagIDs []TagID) tagSet {
|
|
set := map[TagID]bool{}
|
|
for _, tagID := range tagIDs {
|
|
set[tagID] = true
|
|
}
|
|
return set
|
|
}
|
|
|
|
// TagIntersection returns a set intersection of the provided sets
|
|
func TagIntersection(sets ...tagSet) tagSet {
|
|
intersection := tagSet{}
|
|
if len(sets) == 0 {
|
|
return intersection
|
|
}
|
|
setA := sets[0]
|
|
for tag := range setA {
|
|
inAll := true
|
|
for _, setB := range sets {
|
|
if !setB[tag] {
|
|
inAll = false
|
|
break
|
|
}
|
|
}
|
|
|
|
if inAll {
|
|
intersection[tag] = true
|
|
}
|
|
}
|
|
|
|
return intersection
|
|
}
|
|
|
|
// TagUnion returns a set union of provided sets
|
|
func TagUnion(sets ...tagSet) tagSet {
|
|
union := tagSet{}
|
|
for _, set := range sets {
|
|
for tag := range set {
|
|
union[tag] = true
|
|
}
|
|
}
|
|
return union
|
|
}
|
|
|
|
// TagContains return true if setA contains setB
|
|
func TagContains(setA tagSet, setB tagSet) bool {
|
|
containedTags := 0
|
|
for tag := range setB {
|
|
if setA[tag] {
|
|
containedTags++
|
|
}
|
|
}
|
|
return containedTags == len(setA)
|
|
}
|
|
|
|
// TagDifference returns the set difference tagsA - tagsB
|
|
func TagDifference(setA tagSet, setB tagSet) tagSet {
|
|
set := tagSet{}
|
|
|
|
for tag := range setA {
|
|
if !setB[tag] {
|
|
set[tag] = true
|
|
}
|
|
}
|
|
|
|
return set
|
|
}
|