1
0
mirror of https://github.com/charlienet/go-mixed.git synced 2025-07-17 16:12:42 +08:00
Files
go-mixed/sets/sorted_set.go
2023-08-25 15:31:00 +08:00

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
}