@@ -83,6 +83,44 @@ pub fn permutations<I: Iterator>(iter: I, k: usize) -> Permutations<I> {
8383 }
8484}
8585
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+
86124impl < I > Iterator for Permutations < I >
87125where
88126 I : Iterator ,
@@ -159,44 +197,6 @@ where
159197 }
160198}
161199
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-
200200impl CompleteState {
201201 fn advance ( & mut self ) {
202202 * self = match * self {
0 commit comments