79 lines
1.5 KiB
Go
79 lines
1.5 KiB
Go
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 d’entré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 d’entré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
|
||
}
|