addr-maybe-ids-by-distance.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package containers
  2. import (
  3. "github.com/anacrolix/missinggo/v2/iter"
  4. "github.com/anacrolix/stm/stmutil"
  5. "github.com/anacrolix/dht/v2/int160"
  6. "github.com/anacrolix/dht/v2/types"
  7. )
  8. type addrMaybeId = types.AddrMaybeId
  9. type AddrMaybeIdsByDistance interface {
  10. Add(addrMaybeId) AddrMaybeIdsByDistance
  11. Next() addrMaybeId
  12. Delete(addrMaybeId) AddrMaybeIdsByDistance
  13. Len() int
  14. }
  15. type stmSettishWrapper struct {
  16. set stmutil.Settish
  17. }
  18. func (me stmSettishWrapper) Next() addrMaybeId {
  19. first, _ := iter.First(me.set.Iter)
  20. return first.(addrMaybeId)
  21. }
  22. func (me stmSettishWrapper) Delete(x addrMaybeId) AddrMaybeIdsByDistance {
  23. return stmSettishWrapper{me.set.Delete(x)}
  24. }
  25. func (me stmSettishWrapper) Len() int {
  26. return me.set.Len()
  27. }
  28. func (me stmSettishWrapper) Add(x addrMaybeId) AddrMaybeIdsByDistance {
  29. return stmSettishWrapper{me.set.Add(x)}
  30. }
  31. func NewImmutableAddrMaybeIdsByDistance(target int160.T) AddrMaybeIdsByDistance {
  32. return stmSettishWrapper{stmutil.NewSortedSet(func(l, r interface{}) bool {
  33. return l.(addrMaybeId).CloserThan(r.(addrMaybeId), target)
  34. })}
  35. }