gob/collection/set.go

79 lines
1.5 KiB
Go
Raw Permalink Normal View History

2023-09-23 13:39:05 +00:00
package collection
var empty struct{}
// Set est une collection de valeurs uniques.
type Set[T comparable] map[T]struct{}
// Add ajoute les valeurs en entrée dans le set et retourne le set lui-même.
func (s Set[T]) Add(in ...T) Set[T] {
for _, e := range in {
s[e] = empty
}
return s
}
// Del supprime les valeurs données en entrées du set et retourne le set lui-même.
func (s Set[T]) Del(in ...T) Set[T] {
for _, e := range in {
delete(s, e)
}
return s
}
// Contains retourne vrai si le set contient la valeur d'entrée.
func (s Set[T]) Contains(in T) (out bool) {
_, out = s[in]
return
}
// ContainsOneOf retourne vrai si le set contient au moins une des valeurs dentrée.
func (s Set[T]) ContainsOneOf(in ...T) bool {
for _, e := range in {
if s.Contains(e) {
return true
}
}
return false
}
// ContainsAll retourne vrai si le set contient toutes les valeurs dentrée.
func (s Set[T]) ContainsAll(in ...T) bool {
for _, e := range in {
if !s.Contains(e) {
return false
}
}
return true
}
// Len retourne le nombre déléments du set.
func (s Set[T]) Len() int {
return len(s)
}
// ToSlice convertit un set en slice d'éléments de même type.
func (s Set[T]) ToSlice() (out []T) {
out = make([]T, len(s))
i := 0
for e := range s {
out[i] = e
i++
}
return
}
// NewSet retourne un set initialisé avec les valeurs d'entrée.
func NewSet[T comparable](in ...T) (out Set[T]) {
out = make(Set[T])
out.Add(in...)
return
}