collections.go

 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}