/
cidqueue.go
64 lines (52 loc) · 1.08 KB
/
cidqueue.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package session
import cid "github.com/ipfs/go-cid"
import "github.com/peergos/go-bitswap-auth/auth"
type cidQueue struct {
elems []auth.Want
eset *cid.Set
}
func newCidQueue() *cidQueue {
return &cidQueue{eset: cid.NewSet()}
}
func (cq *cidQueue) Pop() auth.Want {
for {
if len(cq.elems) == 0 {
return auth.Want{}
}
out := cq.elems[0]
cq.elems = cq.elems[1:]
if cq.eset.Has(out.Cid) {
cq.eset.Remove(out.Cid)
return out
}
}
}
func (cq *cidQueue) Cids() []auth.Want {
// Lazily delete from the list any cids that were removed from the set
if len(cq.elems) > cq.eset.Len() {
i := 0
for _, c := range cq.elems {
if cq.eset.Has(c.Cid) {
cq.elems[i] = c
i++
}
}
cq.elems = cq.elems[:i]
}
// Make a copy of the cids
return append([]auth.Want{}, cq.elems...)
}
func (cq *cidQueue) Push(c auth.Want) {
if cq.eset.Visit(c.Cid) {
cq.elems = append(cq.elems, c)
}
}
func (cq *cidQueue) Remove(c cid.Cid) {
cq.eset.Remove(c)
}
func (cq *cidQueue) Has(c cid.Cid) bool {
return cq.eset.Has(c)
}
func (cq *cidQueue) Len() int {
return cq.eset.Len()
}