64 lines
1.4 KiB
Go
64 lines
1.4 KiB
Go
|
package commands
|
||
|
|
||
|
func newCallFromToBlockProvider(isBackwards bool, callFromProvider, callToProvider BlockProvider) BlockProvider {
|
||
|
var nextFrom, nextTo uint64
|
||
|
var hasMoreFrom, hasMoreTo bool
|
||
|
initialized := false
|
||
|
|
||
|
return func() (uint64, bool, error) {
|
||
|
if !initialized {
|
||
|
initialized = true
|
||
|
|
||
|
var err error
|
||
|
if nextFrom, hasMoreFrom, err = callFromProvider(); err != nil {
|
||
|
return 0, false, err
|
||
|
}
|
||
|
hasMoreFrom = hasMoreFrom || nextFrom != 0
|
||
|
|
||
|
if nextTo, hasMoreTo, err = callToProvider(); err != nil {
|
||
|
return 0, false, err
|
||
|
}
|
||
|
hasMoreTo = hasMoreTo || nextTo != 0
|
||
|
}
|
||
|
|
||
|
if !hasMoreFrom && !hasMoreTo {
|
||
|
return 0, false, nil
|
||
|
}
|
||
|
|
||
|
var blockNum uint64
|
||
|
if !hasMoreFrom {
|
||
|
blockNum = nextTo
|
||
|
} else if !hasMoreTo {
|
||
|
blockNum = nextFrom
|
||
|
} else {
|
||
|
blockNum = nextFrom
|
||
|
if isBackwards {
|
||
|
if nextTo < nextFrom {
|
||
|
blockNum = nextTo
|
||
|
}
|
||
|
} else {
|
||
|
if nextTo > nextFrom {
|
||
|
blockNum = nextTo
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Pull next; it may be that from AND to contains the same blockNum
|
||
|
if hasMoreFrom && blockNum == nextFrom {
|
||
|
var err error
|
||
|
if nextFrom, hasMoreFrom, err = callFromProvider(); err != nil {
|
||
|
return 0, false, err
|
||
|
}
|
||
|
hasMoreFrom = hasMoreFrom || nextFrom != 0
|
||
|
}
|
||
|
if hasMoreTo && blockNum == nextTo {
|
||
|
var err error
|
||
|
if nextTo, hasMoreTo, err = callToProvider(); err != nil {
|
||
|
return 0, false, err
|
||
|
}
|
||
|
hasMoreTo = hasMoreTo || nextTo != 0
|
||
|
}
|
||
|
return blockNum, hasMoreFrom || hasMoreTo, nil
|
||
|
}
|
||
|
}
|