mirror of
https://github.com/junegunn/fzf.git
synced 2025-08-05 22:52:06 -07:00
40 lines
851 B
Go
40 lines
851 B
Go
package util
|
|
|
|
import "sync"
|
|
|
|
// ConcurrentSet is a thread-safe set implementation.
|
|
type ConcurrentSet[T comparable] struct {
|
|
lock sync.RWMutex
|
|
items map[T]struct{}
|
|
}
|
|
|
|
// NewConcurrentSet creates a new ConcurrentSet.
|
|
func NewConcurrentSet[T comparable]() *ConcurrentSet[T] {
|
|
return &ConcurrentSet[T]{
|
|
items: make(map[T]struct{}),
|
|
}
|
|
}
|
|
|
|
// Add adds an item to the set.
|
|
func (s *ConcurrentSet[T]) Add(item T) {
|
|
s.lock.Lock()
|
|
defer s.lock.Unlock()
|
|
s.items[item] = struct{}{}
|
|
}
|
|
|
|
// Remove removes an item from the set.
|
|
func (s *ConcurrentSet[T]) Remove(item T) {
|
|
s.lock.Lock()
|
|
defer s.lock.Unlock()
|
|
delete(s.items, item)
|
|
}
|
|
|
|
// ForEach iterates over each item in the set and applies the provided function.
|
|
func (s *ConcurrentSet[T]) ForEach(fn func(item T)) {
|
|
s.lock.RLock()
|
|
defer s.lock.RUnlock()
|
|
for item := range s.items {
|
|
fn(item)
|
|
}
|
|
}
|