pomerium/internal/sets/size_limited.go
Caleb Doxsey b5ac7dbc76
sets: convert set types to generics (#3519)
* sets: convert set types to generics

* sets: use internal sets package
2022-07-29 12:32:17 -06:00

36 lines
797 B
Go

package sets
// A SizeLimited is a Set which is limited to a given size. Once
// the capacity is reached an element will be removed at random.
type SizeLimited[T comparable] struct {
m map[T]struct{}
capacity int
}
// NewSizeLimited create a new SizeLimited.
func NewSizeLimited[T comparable](capacity int) *SizeLimited[T] {
return &SizeLimited[T]{
m: make(map[T]struct{}),
capacity: capacity,
}
}
// Add adds an element to the set.
func (s *SizeLimited[T]) Add(element T) {
s.m[element] = struct{}{}
for len(s.m) > s.capacity {
for k := range s.m {
delete(s.m, k)
break
}
}
}
// ForEach iterates over all the elements in the set.
func (s *SizeLimited[T]) ForEach(callback func(element T) bool) {
for k := range s.m {
if !callback(k) {
return
}
}
}