mirror of
https://github.com/charlienet/go-mixed.git
synced 2025-07-18 00:22:41 +08:00
88 lines
1.5 KiB
Go
88 lines
1.5 KiB
Go
package sets
|
|
|
|
import (
|
|
"slices"
|
|
|
|
"github.com/charlienet/go-mixed/expr"
|
|
"golang.org/x/exp/constraints"
|
|
)
|
|
|
|
type sorted_set[T constraints.Ordered] struct {
|
|
sorted []T
|
|
set Set[T]
|
|
}
|
|
|
|
func NewSortedSet[T constraints.Ordered](t ...T) *sorted_set[T] {
|
|
return &sorted_set[T]{
|
|
set: NewHashSet[T](),
|
|
}
|
|
}
|
|
|
|
func (s *sorted_set[T]) Add(values ...T) {
|
|
for _, v := range values {
|
|
if !s.set.Contains(v) {
|
|
s.sorted = append(s.sorted, v)
|
|
s.set.Add(v)
|
|
}
|
|
}
|
|
}
|
|
|
|
func (s *sorted_set[T]) Remove(v T) {
|
|
if s.set.Contains(v) {
|
|
for index := range s.sorted {
|
|
if s.sorted[index] == v {
|
|
s.sorted = append(s.sorted[:index], s.sorted[index+1:]...)
|
|
break
|
|
}
|
|
}
|
|
|
|
s.set.Remove(v)
|
|
}
|
|
}
|
|
|
|
func (s *sorted_set[T]) Asc() Set[T] {
|
|
keys := s.sorted
|
|
slices.Sort(keys)
|
|
|
|
return &sorted_set[T]{
|
|
sorted: keys,
|
|
set: NewHashSet(keys...),
|
|
}
|
|
}
|
|
|
|
func (s *sorted_set[T]) Desc() Set[T] {
|
|
keys := s.sorted
|
|
slices.SortFunc(keys, func(a, b T) int {
|
|
if a == b {
|
|
return 0
|
|
}
|
|
|
|
return expr.Ternary(a > b, -1, 1)
|
|
})
|
|
|
|
return &sorted_set[T]{
|
|
sorted: keys,
|
|
set: NewHashSet(keys...),
|
|
}
|
|
}
|
|
|
|
func (s *sorted_set[T]) Contains(v T) bool {
|
|
return s.set.Contains(v)
|
|
}
|
|
|
|
func (s *sorted_set[T]) ContainsAny(values ...T) bool {
|
|
return s.set.ContainsAny(values...)
|
|
}
|
|
|
|
func (s *sorted_set[T]) ContainsAll(values ...T) bool {
|
|
return s.set.ContainsAll(values...)
|
|
}
|
|
|
|
func (s *sorted_set[T]) IsEmpty() bool {
|
|
return s.set.IsEmpty()
|
|
}
|
|
|
|
func (s *sorted_set[T]) ToSlice() []T {
|
|
return s.sorted
|
|
}
|