From 247d168af6fabcc322f54ad366f4fb45f781137b Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Sat, 21 Jun 2025 23:24:38 +0900 Subject: Terminate running background transform on exit Close #4422 --- src/util/concurrent_set.go | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/util/concurrent_set.go (limited to 'src/util') diff --git a/src/util/concurrent_set.go b/src/util/concurrent_set.go new file mode 100644 index 00000000..c2ffc619 --- /dev/null +++ b/src/util/concurrent_set.go @@ -0,0 +1,39 @@ +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) + } +} -- cgit v1.2.3