74 lines
1.4 KiB
Go
74 lines
1.4 KiB
Go
package kit
|
|
|
|
import (
|
|
"cmp"
|
|
"sync"
|
|
)
|
|
|
|
// List is unique list, V is used only for AddMapKeys
|
|
type List[T cmp.Ordered, V any] struct {
|
|
mu *sync.Mutex
|
|
data map[T]struct{}
|
|
}
|
|
|
|
// NewList creates new list
|
|
func NewList[T cmp.Ordered, V any]() *List[T, V] {
|
|
return &List[T, V]{
|
|
mu: &sync.Mutex{},
|
|
data: make(map[T]struct{}),
|
|
}
|
|
}
|
|
|
|
// NewListFrom creates a new list and popupates it from slice
|
|
func NewListFrom[T cmp.Ordered](slice []T) *List[T, T] {
|
|
list := NewList[T, T]()
|
|
list.AddSlice(slice)
|
|
return list
|
|
}
|
|
|
|
// AddMapKeys adds keys from map to the list
|
|
func (l *List[T, V]) AddMapKeys(datamap map[T]V) {
|
|
for k := range datamap {
|
|
l.Add(k)
|
|
}
|
|
}
|
|
|
|
// AddSlice adds keys from slice to the list
|
|
func (l *List[T, V]) AddSlice(dataslice []T) {
|
|
for _, k := range dataslice {
|
|
l.Add(k)
|
|
}
|
|
}
|
|
|
|
// Add item to the list
|
|
func (l *List[T, V]) Add(item T) {
|
|
l.mu.Lock()
|
|
if _, ok := l.data[item]; !ok {
|
|
l.data[item] = struct{}{}
|
|
}
|
|
l.mu.Unlock()
|
|
}
|
|
|
|
// RemoveSlice removes items from data using slice
|
|
func (l *List[T, V]) RemoveSlice(dataslice []T) {
|
|
for _, k := range dataslice {
|
|
l.Remove(k)
|
|
}
|
|
}
|
|
|
|
// Remove item from list
|
|
func (l *List[T, V]) Remove(item T) {
|
|
l.mu.Lock()
|
|
delete(l.data, item)
|
|
l.mu.Unlock()
|
|
}
|
|
|
|
// Len - data length
|
|
func (l *List[T, V]) Len() int {
|
|
return len(l.data)
|
|
}
|
|
|
|
// Slice returns list data as slice
|
|
func (l *List[T, V]) Slice() []T {
|
|
return MapKeys(l.data)
|
|
}
|