1package collections
2
3// Unique returns values with duplicates removed, preserving first-seen order.
4func Unique[S ~[]E, E comparable](values S) S {
5 seen := make(map[E]struct{}, len(values))
6 unique := make(S, 0, len(values))
7 for _, value := range values {
8 if _, ok := seen[value]; ok {
9 continue
10 }
11 seen[value] = struct{}{}
12 unique = append(unique, value)
13 }
14 return unique
15}
16
17// UniqueNonEmpty returns values with zero values and duplicates removed.
18func UniqueNonEmpty[S ~[]E, E comparable](values S) S {
19 var zero E
20 nonEmpty := make(S, 0, len(values))
21 for _, value := range values {
22 if value == zero {
23 continue
24 }
25 nonEmpty = append(nonEmpty, value)
26 }
27 return Unique(nonEmpty)
28}