@@ -83,44 +83,6 @@ pub fn permutations<I: Iterator>(iter: I, k: usize) -> Permutations<I> {
83
83
}
84
84
}
85
85
86
- impl < I > Permutations < I >
87
- where
88
- I : Iterator ,
89
- I :: Item : Clone
90
- {
91
- fn advance ( & mut self ) {
92
- let & mut Permutations { ref mut vals, ref mut state } = self ;
93
-
94
- * state = match * state {
95
- PermutationState :: StartUnknownLen { k } => {
96
- PermutationState :: OngoingUnknownLen { k, min_n : k }
97
- }
98
- PermutationState :: OngoingUnknownLen { k, min_n } => {
99
- if vals. get_next ( ) {
100
- PermutationState :: OngoingUnknownLen { k, min_n : min_n + 1 }
101
- } else {
102
- let n = min_n;
103
- let prev_iteration_count = n - k + 1 ;
104
- let mut complete_state = CompleteState :: Start { n, k } ;
105
-
106
- // Advance the complete-state iterator to the correct point
107
- for _ in 0 ..( prev_iteration_count + 1 ) {
108
- complete_state. advance ( ) ;
109
- }
110
-
111
- PermutationState :: Complete ( complete_state)
112
- }
113
- }
114
- PermutationState :: Complete ( ref mut state) => {
115
- state. advance ( ) ;
116
-
117
- return ;
118
- }
119
- PermutationState :: Empty => { return ; }
120
- } ;
121
- }
122
- }
123
-
124
86
impl < I > Iterator for Permutations < I >
125
87
where
126
88
I : Iterator ,
@@ -129,10 +91,35 @@ where
129
91
type Item = Vec < I :: Item > ;
130
92
131
93
fn next ( & mut self ) -> Option < Self :: Item > {
132
- self . advance ( ) ;
94
+ {
95
+ let & mut Permutations { ref mut vals, ref mut state } = self ;
96
+ match * state {
97
+ PermutationState :: StartUnknownLen { k } => {
98
+ * state = PermutationState :: OngoingUnknownLen { k, min_n : k } ;
99
+ } ,
100
+ PermutationState :: OngoingUnknownLen { k, min_n } => {
101
+ if vals. get_next ( ) {
102
+ * state = PermutationState :: OngoingUnknownLen { k, min_n : min_n + 1 } ;
103
+ } else {
104
+ let n = min_n;
105
+ let prev_iteration_count = n - k + 1 ;
106
+ let mut complete_state = CompleteState :: Start { n, k } ;
133
107
134
- let & mut Permutations { ref vals, ref state } = self ;
108
+ // Advance the complete-state iterator to the correct point
109
+ for _ in 0 ..( prev_iteration_count + 1 ) {
110
+ complete_state. advance ( ) ;
111
+ }
135
112
113
+ * state = PermutationState :: Complete ( complete_state) ;
114
+ }
115
+ } ,
116
+ PermutationState :: Complete ( ref mut state) => {
117
+ state. advance ( ) ;
118
+ } ,
119
+ PermutationState :: Empty => { } ,
120
+ } ;
121
+ }
122
+ let & mut Permutations { ref vals, ref state } = self ;
136
123
match * state {
137
124
PermutationState :: StartUnknownLen { .. } => panic ! ( "unexpected iterator state" ) ,
138
125
PermutationState :: OngoingUnknownLen { k, min_n } => {
0 commit comments