summaryrefslogtreecommitdiff
path: root/src/util/concurrent_set.go
blob: c2ffc61951609d46624c705b4d60baf77625fa5c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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)
	}
}