@ -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 ( )
}