@@ -83,6 +83,44 @@ 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
+
86
124
impl < I > Iterator for Permutations < I >
87
125
where
88
126
I : Iterator ,
@@ -159,44 +197,6 @@ where
159
197
}
160
198
}
161
199
162
- impl < I > Permutations < I >
163
- where
164
- I : Iterator ,
165
- I :: Item : Clone
166
- {
167
- fn advance ( & mut self ) {
168
- let & mut Permutations { ref mut vals, ref mut state } = self ;
169
-
170
- * state = match * state {
171
- PermutationState :: StartUnknownLen { k } => {
172
- PermutationState :: OngoingUnknownLen { k, min_n : k }
173
- }
174
- PermutationState :: OngoingUnknownLen { k, min_n } => {
175
- if vals. get_next ( ) {
176
- PermutationState :: OngoingUnknownLen { k, min_n : min_n + 1 }
177
- } else {
178
- let n = min_n;
179
- let prev_iteration_count = n - k + 1 ;
180
- let mut complete_state = CompleteState :: Start { n, k } ;
181
-
182
- // Advance the complete-state iterator to the correct point
183
- for _ in 0 ..( prev_iteration_count + 1 ) {
184
- complete_state. advance ( ) ;
185
- }
186
-
187
- PermutationState :: Complete ( complete_state)
188
- }
189
- }
190
- PermutationState :: Complete ( ref mut state) => {
191
- state. advance ( ) ;
192
-
193
- return ;
194
- }
195
- PermutationState :: Empty => { return ; }
196
- } ;
197
- }
198
- }
199
-
200
200
impl CompleteState {
201
201
fn advance ( & mut self ) {
202
202
* self = match * self {
0 commit comments