iterutils.go 663 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. package iter
  2. import "math/rand"
  3. type seq struct {
  4. i []int
  5. }
  6. // Creates sequence of values from [0, n)
  7. func newSeq(n int) seq {
  8. return seq{make([]int, n, n)}
  9. }
  10. func (me seq) Index(i int) (ret int) {
  11. ret = me.i[i]
  12. if ret == 0 {
  13. ret = i
  14. }
  15. return
  16. }
  17. func (me seq) Len() int {
  18. return len(me.i)
  19. }
  20. // Remove the nth value from the sequence.
  21. func (me *seq) DeleteIndex(index int) {
  22. me.i[index] = me.Index(me.Len() - 1)
  23. me.i = me.i[:me.Len()-1]
  24. }
  25. func ForPerm(n int, callback func(i int) (more bool)) bool {
  26. s := newSeq(n)
  27. for s.Len() > 0 {
  28. r := rand.Intn(s.Len())
  29. if !callback(s.Index(r)) {
  30. return false
  31. }
  32. s.DeleteIndex(r)
  33. }
  34. return true
  35. }