postmoogle/vendor/github.com/etkecc/go-kit/list.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)
}