123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- package btree
- type Set[K ordered] struct {
- base Map[K, struct{}]
- }
- // Copy
- func (tr *Set[K]) Copy() *Set[K] {
- tr2 := new(Set[K])
- tr2.base = *tr.base.Copy()
- return tr2
- }
- // Insert an item
- func (tr *Set[K]) Insert(key K) {
- tr.base.Set(key, struct{}{})
- }
- func (tr *Set[K]) Scan(iter func(key K) bool) {
- tr.base.Scan(func(key K, value struct{}) bool {
- return iter(key)
- })
- }
- // Get a value for key
- func (tr *Set[K]) Contains(key K) bool {
- _, ok := tr.base.Get(key)
- return ok
- }
- // Len returns the number of items in the tree
- func (tr *Set[K]) Len() int {
- return tr.base.Len()
- }
- // Delete an item
- func (tr *Set[K]) Delete(key K) {
- tr.base.Delete(key)
- }
- // Ascend the tree within the range [pivot, last]
- // Pass nil for pivot to scan all item in ascending order
- // Return false to stop iterating
- func (tr *Set[K]) Ascend(pivot K, iter func(key K) bool) {
- tr.base.Ascend(pivot, func(key K, value struct{}) bool {
- return iter(key)
- })
- }
- func (tr *Set[K]) Reverse(iter func(key K) bool) {
- tr.base.Reverse(func(key K, value struct{}) bool {
- return iter(key)
- })
- }
- // Descend the tree within the range [pivot, first]
- // Pass nil for pivot to scan all item in descending order
- // Return false to stop iterating
- func (tr *Set[K]) Descend(pivot K, iter func(key K) bool) {
- tr.base.Descend(pivot, func(key K, value struct{}) bool {
- return iter(key)
- })
- }
- // Load is for bulk loading pre-sorted items
- func (tr *Set[K]) Load(key K) {
- tr.base.Load(key, struct{}{})
- }
- // Min returns the minimum item in tree.
- // Returns nil if the treex has no items.
- func (tr *Set[K]) Min() (K, bool) {
- key, _, ok := tr.base.Min()
- return key, ok
- }
- // Max returns the maximum item in tree.
- // Returns nil if the tree has no items.
- func (tr *Set[K]) Max() (K, bool) {
- key, _, ok := tr.base.Max()
- return key, ok
- }
- // PopMin removes the minimum item in tree and returns it.
- // Returns nil if the tree has no items.
- func (tr *Set[K]) PopMin() (K, bool) {
- key, _, ok := tr.base.PopMin()
- return key, ok
- }
- // PopMax removes the maximum item in tree and returns it.
- // Returns nil if the tree has no items.
- func (tr *Set[K]) PopMax() (K, bool) {
- key, _, ok := tr.base.PopMax()
- return key, ok
- }
- // GetAt returns the value at index.
- // Return nil if the tree is empty or the index is out of bounds.
- func (tr *Set[K]) GetAt(index int) (K, bool) {
- key, _, ok := tr.base.GetAt(index)
- return key, ok
- }
- // DeleteAt deletes the item at index.
- // Return nil if the tree is empty or the index is out of bounds.
- func (tr *Set[K]) DeleteAt(index int) (K, bool) {
- key, _, ok := tr.base.DeleteAt(index)
- return key, ok
- }
- // Height returns the height of the tree.
- // Returns zero if tree has no items.
- func (tr *Set[K]) Height() int {
- return tr.base.Height()
- }
- // SetIter represents an iterator for btree.Set
- type SetIter[K ordered] struct {
- base MapIter[K, struct{}]
- }
- // Iter returns a read-only iterator.
- func (tr *Set[K]) Iter() SetIter[K] {
- return SetIter[K]{tr.base.Iter()}
- }
- // Seek to item greater-or-equal-to key.
- // Returns false if there was no item found.
- func (iter *SetIter[K]) Seek(key K) bool {
- return iter.base.Seek(key)
- }
- // First moves iterator to first item in tree.
- // Returns false if the tree is empty.
- func (iter *SetIter[K]) First() bool {
- return iter.base.First()
- }
- // Last moves iterator to last item in tree.
- // Returns false if the tree is empty.
- func (iter *SetIter[K]) Last() bool {
- return iter.base.Last()
- }
- // Next moves iterator to the next item in iterator.
- // Returns false if the tree is empty or the iterator is at the end of
- // the tree.
- func (iter *SetIter[K]) Next() bool {
- return iter.base.Next()
- }
- // Prev moves iterator to the previous item in iterator.
- // Returns false if the tree is empty or the iterator is at the beginning of
- // the tree.
- func (iter *SetIter[K]) Prev() bool {
- return iter.base.Prev()
- }
- // Key returns the current iterator item key.
- func (iter *SetIter[K]) Key() K {
- return iter.base.Key()
- }
- // Keys returns all the keys in order.
- func (tr *Set[K]) Keys() []K {
- return tr.base.Keys()
- }
|