mirror of
https://github.com/ergochat/ergo.git
synced 2024-12-24 19:52:35 +01:00
169 lines
4.0 KiB
Go
169 lines
4.0 KiB
Go
|
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()
|
||
|
}
|