github.com/anacrolix/torrent@v1.61.0/internal/indexed/btree-tidwall.go (about) 1 package indexed 2 3 import ( 4 "iter" 5 6 "github.com/tidwall/btree" 7 ) 8 9 type tidwallBtreeSet[R any] struct { 10 inner *btree.BTreeG[R] 11 } 12 13 func (me tidwallBtreeSet[R]) Iter(yield func(R) bool) { 14 it := me.inner.Iter() 15 if it.First() { 16 for { 17 if !yield(it.Item()) { 18 return 19 } 20 if !it.Next() { 21 break 22 } 23 } 24 } 25 it.Release() 26 } 27 28 func (me tidwallBtreeSet[R]) IterFrom(start R) iter.Seq[R] { 29 return func(yield func(R) bool) { 30 me.inner.Ascend(start, yield) 31 } 32 } 33 34 func (me tidwallBtreeSet[R]) Delete(r R) (actual R, removed bool) { 35 return me.inner.Delete(r) 36 } 37 38 func (me tidwallBtreeSet[R]) Upsert(r R) (_ R, overwrote bool) { 39 return me.inner.Set(r) 40 } 41 42 func (me tidwallBtreeSet[R]) Contains(r R) bool { 43 _, ok := me.inner.Get(r) 44 return ok 45 } 46 47 func (me tidwallBtreeSet[R]) Len() int { 48 return me.inner.Len() 49 } 50 51 func makeTidwallBtreeSet[R any](cmp func(R, R) int) tidwallBtreeSet[R] { 52 inner := btree.NewBTreeGOptions(func(a, b R) bool { 53 return cmp(a, b) < 0 54 }, btree.Options{ 55 Degree: 32, 56 NoLocks: true, 57 }) 58 return tidwallBtreeSet[R]{inner: inner} 59 }