diff options
Diffstat (limited to 'swarm/pot/pot.go')
-rw-r--r-- | swarm/pot/pot.go | 74 |
1 files changed, 32 insertions, 42 deletions
diff --git a/swarm/pot/pot.go b/swarm/pot/pot.go index 0797b286c..7e3967f3f 100644 --- a/swarm/pot/pot.go +++ b/swarm/pot/pot.go @@ -447,60 +447,50 @@ func union(t0, t1 *Pot, pof Pof) (*Pot, int) { return n, common } -// Each called with (f) is a synchronous iterator over the bins of a node -// respecting an ordering -// proximity > pinnedness -func (t *Pot) Each(f func(Val, int) bool) bool { +// Each is a synchronous iterator over the elements of pot with function f. +func (t *Pot) Each(f func(Val) bool) bool { return t.each(f) } -func (t *Pot) each(f func(Val, int) bool) bool { - var next bool +// each is a synchronous iterator over the elements of pot with function f. +// the iteration ends if the function return false or there are no more elements. +func (t *Pot) each(f func(Val) bool) bool { + if t == nil || t.size == 0 { + return false + } for _, n := range t.bins { - if n == nil { - return true - } - next = n.each(f) - if !next { + if !n.each(f) { return false } } - if t.size == 0 { - return false - } - return f(t.pin, t.po) + return f(t.pin) } -// eachFrom called with (f, start) is a synchronous iterator over the elements of a Pot -// within the inclusive range starting from proximity order start -// the function argument is passed the value and the proximity order wrt the root pin -// it does NOT include the pinned item of the root -// respecting an ordering -// proximity > pinnedness -// the iteration ends if the function return false or there are no more elements -// end of a po range can be implemented since po is passed to the function -func (t *Pot) eachFrom(f func(Val, int) bool, po int) bool { - var next bool - _, lim := t.getPos(po) - for i := lim; i < len(t.bins); i++ { - n := t.bins[i] - next = n.each(f) - if !next { +// eachFrom is a synchronous iterator over the elements of pot with function f, +// starting from certain proximity order po, which is passed as a second parameter. +// the iteration ends if the function return false or there are no more elements. +func (t *Pot) eachFrom(f func(Val) bool, po int) bool { + if t == nil || t.size == 0 { + return false + } + _, beg := t.getPos(po) + for i := beg; i < len(t.bins); i++ { + if !t.bins[i].each(f) { return false } } - return f(t.pin, t.po) + return f(t.pin) } // EachBin iterates over bins of the pivot node and offers iterators to the caller on each // subtree passing the proximity order and the size // the iteration continues until the function's return value is false // or there are no more subtries -func (t *Pot) EachBin(val Val, pof Pof, po int, f func(int, int, func(func(val Val, i int) bool) bool) bool) { +func (t *Pot) EachBin(val Val, pof Pof, po int, f func(int, int, func(func(val Val) bool) bool) bool) { t.eachBin(val, pof, po, f) } -func (t *Pot) eachBin(val Val, pof Pof, po int, f func(int, int, func(func(val Val, i int) bool) bool) bool) { +func (t *Pot) eachBin(val Val, pof Pof, po int, f func(int, int, func(func(val Val) bool) bool) bool) { if t == nil || t.size == 0 { return } @@ -520,8 +510,8 @@ func (t *Pot) eachBin(val Val, pof Pof, po int, f func(int, int, func(func(val V } if lim == len(t.bins) { if spr >= po { - f(spr, 1, func(g func(Val, int) bool) bool { - return g(t.pin, spr) + f(spr, 1, func(g func(Val) bool) bool { + return g(t.pin) }) } return @@ -535,9 +525,9 @@ func (t *Pot) eachBin(val Val, pof Pof, po int, f func(int, int, func(func(val V size += n.size } if spr >= po { - if !f(spr, t.size-size, func(g func(Val, int) bool) bool { - return t.eachFrom(func(v Val, j int) bool { - return g(v, spr) + if !f(spr, t.size-size, func(g func(Val) bool) bool { + return t.eachFrom(func(v Val) bool { + return g(v) }, spo) }) { return @@ -585,7 +575,7 @@ func (t *Pot) eachNeighbour(val Val, pof Pof, f func(Val, int) bool) bool { } for i := l - 1; i > ir; i-- { - next = t.bins[i].each(func(v Val, _ int) bool { + next = t.bins[i].each(func(v Val) bool { return f(v, po) }) if !next { @@ -595,7 +585,7 @@ func (t *Pot) eachNeighbour(val Val, pof Pof, f func(Val, int) bool) bool { for i := il - 1; i >= 0; i-- { n := t.bins[i] - next = n.each(func(v Val, _ int) bool { + next = n.each(func(v Val) bool { return f(v, n.po) }) if !next { @@ -709,7 +699,7 @@ func (t *Pot) eachNeighbourAsync(val Val, pof Pof, max int, maxPos int, f func(V wg.Add(m) } go func(pn *Pot, pm int) { - pn.each(func(v Val, _ int) bool { + pn.each(func(v Val) bool { if wg != nil { defer wg.Done() } @@ -736,7 +726,7 @@ func (t *Pot) eachNeighbourAsync(val Val, pof Pof, max int, maxPos int, f func(V wg.Add(m) } go func(pn *Pot, pm int) { - pn.each(func(v Val, _ int) bool { + pn.each(func(v Val) bool { if wg != nil { defer wg.Done() } |