39 lines
850 B
Go
39 lines
850 B
Go
|
package simulation
|
||
|
|
||
|
import (
|
||
|
"math/rand"
|
||
|
|
||
|
"github.com/filecoin-project/go-address"
|
||
|
)
|
||
|
|
||
|
// actorIter is a simple persistent iterator that loops over a set of actors.
|
||
|
type actorIter struct {
|
||
|
actors []address.Address
|
||
|
offset int
|
||
|
}
|
||
|
|
||
|
// shuffle randomly permutes the set of actors.
|
||
|
func (p *actorIter) shuffle() {
|
||
|
rand.Shuffle(len(p.actors), func(i, j int) {
|
||
|
p.actors[i], p.actors[j] = p.actors[j], p.actors[i]
|
||
|
})
|
||
|
}
|
||
|
|
||
|
// next returns the next actor's address and advances the iterator.
|
||
|
func (p *actorIter) next() address.Address {
|
||
|
next := p.actors[p.offset]
|
||
|
p.offset++
|
||
|
p.offset %= len(p.actors)
|
||
|
return next
|
||
|
}
|
||
|
|
||
|
// add adds a new actor to the iterator.
|
||
|
func (p *actorIter) add(addr address.Address) {
|
||
|
p.actors = append(p.actors, addr)
|
||
|
}
|
||
|
|
||
|
// len returns the number of actors in the iterator.
|
||
|
func (p *actorIter) len() int {
|
||
|
return len(p.actors)
|
||
|
}
|