github.com/keltia/go-ipfs@v0.3.8-0.20150909044612-210793031c63/routing/kbucket/sorting.go (about) 1 package kbucket 2 3 import ( 4 "container/list" 5 peer "github.com/ipfs/go-ipfs/p2p/peer" 6 "sort" 7 ) 8 9 // A helper struct to sort peers by their distance to the local node 10 type peerDistance struct { 11 p peer.ID 12 distance ID 13 } 14 15 // peerSorterArr implements sort.Interface to sort peers by xor distance 16 type peerSorterArr []*peerDistance 17 18 func (p peerSorterArr) Len() int { return len(p) } 19 func (p peerSorterArr) Swap(a, b int) { p[a], p[b] = p[b], p[a] } 20 func (p peerSorterArr) Less(a, b int) bool { 21 return p[a].distance.less(p[b].distance) 22 } 23 24 // 25 26 func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) peerSorterArr { 27 for e := peerList.Front(); e != nil; e = e.Next() { 28 p := e.Value.(peer.ID) 29 pID := ConvertPeerID(p) 30 pd := peerDistance{ 31 p: p, 32 distance: xor(target, pID), 33 } 34 peerArr = append(peerArr, &pd) 35 if e == nil { 36 log.Debug("list element was nil") 37 return peerArr 38 } 39 } 40 return peerArr 41 } 42 43 func SortClosestPeers(peers []peer.ID, target ID) []peer.ID { 44 var psarr peerSorterArr 45 for _, p := range peers { 46 pID := ConvertPeerID(p) 47 pd := &peerDistance{ 48 p: p, 49 distance: xor(target, pID), 50 } 51 psarr = append(psarr, pd) 52 } 53 sort.Sort(psarr) 54 var out []peer.ID 55 for _, p := range psarr { 56 out = append(out, p.p) 57 } 58 return out 59 }