goext/dataext/syncSet.go

120 lines
2.2 KiB
Go
Raw Permalink Normal View History

2022-10-27 16:00:57 +02:00
package dataext
import "sync"
2022-12-22 10:23:34 +01:00
type SyncSet[TData comparable] struct {
data map[TData]bool
2022-10-27 16:00:57 +02:00
lock sync.Mutex
}
2024-11-13 15:03:51 +01:00
func NewSyncSet[TData comparable]() *SyncSet[TData] {
return &SyncSet[TData]{data: make(map[TData]bool), lock: sync.Mutex{}}
}
// Add adds `value` to the set
2024-11-13 15:03:51 +01:00
// returns true if the value was actually inserted (value did not exist beforehand)
// returns false if the value already existed
2022-12-22 10:23:34 +01:00
func (s *SyncSet[TData]) Add(value TData) bool {
2022-10-27 16:00:57 +02:00
s.lock.Lock()
defer s.lock.Unlock()
if s.data == nil {
2022-12-22 10:23:34 +01:00
s.data = make(map[TData]bool)
2022-10-27 16:00:57 +02:00
}
_, existsInPreState := s.data[value]
2024-11-13 15:03:51 +01:00
if existsInPreState {
return false
}
2022-10-27 16:00:57 +02:00
2024-11-13 15:03:51 +01:00
s.data[value] = true
return true
2022-10-27 16:00:57 +02:00
}
2022-12-22 10:23:34 +01:00
func (s *SyncSet[TData]) AddAll(values []TData) {
2022-10-27 16:00:57 +02:00
s.lock.Lock()
defer s.lock.Unlock()
if s.data == nil {
2022-12-22 10:23:34 +01:00
s.data = make(map[TData]bool)
2022-10-27 16:00:57 +02:00
}
for _, value := range values {
s.data[value] = true
}
}
2024-11-13 15:03:51 +01:00
func (s *SyncSet[TData]) Remove(value TData) bool {
s.lock.Lock()
defer s.lock.Unlock()
if s.data == nil {
s.data = make(map[TData]bool)
}
_, existsInPreState := s.data[value]
if !existsInPreState {
return false
}
delete(s.data, value)
return true
}
func (s *SyncSet[TData]) RemoveAll(values []TData) {
s.lock.Lock()
defer s.lock.Unlock()
if s.data == nil {
s.data = make(map[TData]bool)
}
for _, value := range values {
delete(s.data, value)
}
}
2022-12-22 10:23:34 +01:00
func (s *SyncSet[TData]) Contains(value TData) bool {
2022-10-27 16:00:57 +02:00
s.lock.Lock()
defer s.lock.Unlock()
if s.data == nil {
2022-12-22 10:23:34 +01:00
s.data = make(map[TData]bool)
2022-10-27 16:00:57 +02:00
}
_, ok := s.data[value]
return ok
}
2022-12-22 10:23:34 +01:00
func (s *SyncSet[TData]) Get() []TData {
2022-10-27 16:00:57 +02:00
s.lock.Lock()
defer s.lock.Unlock()
if s.data == nil {
2022-12-22 10:23:34 +01:00
s.data = make(map[TData]bool)
2022-10-27 16:00:57 +02:00
}
2022-12-22 10:23:34 +01:00
r := make([]TData, 0, len(s.data))
2022-10-27 16:00:57 +02:00
for k := range s.data {
r = append(r, k)
}
return r
}
2024-11-13 15:03:51 +01:00
// AddIfNotContains
// returns true if the value was actually added (value did not exist beforehand)
// returns false if the value already existed
func (s *SyncSet[TData]) AddIfNotContains(key TData) bool {
return s.Add(key)
}
// RemoveIfContains
// returns true if the value was actually removed (value did exist beforehand)
// returns false if the value did not exist in the set
func (s *SyncSet[TData]) RemoveIfContains(key TData) bool {
return s.Remove(key)
}