45 lines
859 B
Go
45 lines
859 B
Go
package request_strategy
|
|
|
|
import (
|
|
"github.com/ajwerner/btree"
|
|
)
|
|
|
|
type ajwernerBtree struct {
|
|
btree btree.Set[pieceRequestOrderItem]
|
|
}
|
|
|
|
var _ Btree = (*ajwernerBtree)(nil)
|
|
|
|
func NewAjwernerBtree() *ajwernerBtree {
|
|
return &ajwernerBtree{
|
|
btree: btree.MakeSet(func(t, t2 pieceRequestOrderItem) int {
|
|
return pieceOrderLess(&t, &t2).OrderingInt()
|
|
}),
|
|
}
|
|
}
|
|
|
|
func mustValue[V any](b bool, panicValue V) {
|
|
if !b {
|
|
panic(panicValue)
|
|
}
|
|
}
|
|
|
|
func (a *ajwernerBtree) Delete(item pieceRequestOrderItem) {
|
|
mustValue(a.btree.Delete(item), item)
|
|
}
|
|
|
|
func (a *ajwernerBtree) Add(item pieceRequestOrderItem) {
|
|
_, overwrote := a.btree.Upsert(item)
|
|
mustValue(!overwrote, item)
|
|
}
|
|
|
|
func (a *ajwernerBtree) Scan(f func(pieceRequestOrderItem) bool) {
|
|
it := a.btree.Iterator()
|
|
it.First()
|
|
for it.First(); it.Valid(); it.Next() {
|
|
if !f(it.Cur()) {
|
|
break
|
|
}
|
|
}
|
|
}
|