43 lines
663 B
Go
43 lines
663 B
Go
|
package iter
|
||
|
|
||
|
import "math/rand"
|
||
|
|
||
|
type seq struct {
|
||
|
i []int
|
||
|
}
|
||
|
|
||
|
// Creates sequence of values from [0, n)
|
||
|
func newSeq(n int) seq {
|
||
|
return seq{make([]int, n, n)}
|
||
|
}
|
||
|
|
||
|
func (me seq) Index(i int) (ret int) {
|
||
|
ret = me.i[i]
|
||
|
if ret == 0 {
|
||
|
ret = i
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func (me seq) Len() int {
|
||
|
return len(me.i)
|
||
|
}
|
||
|
|
||
|
// Remove the nth value from the sequence.
|
||
|
func (me *seq) DeleteIndex(index int) {
|
||
|
me.i[index] = me.Index(me.Len() - 1)
|
||
|
me.i = me.i[:me.Len()-1]
|
||
|
}
|
||
|
|
||
|
func ForPerm(n int, callback func(i int) (more bool)) bool {
|
||
|
s := newSeq(n)
|
||
|
for s.Len() > 0 {
|
||
|
r := rand.Intn(s.Len())
|
||
|
if !callback(s.Index(r)) {
|
||
|
return false
|
||
|
}
|
||
|
s.DeleteIndex(r)
|
||
|
}
|
||
|
return true
|
||
|
}
|