@@ -83,44 +83,6 @@ 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-
12486impl < I > Iterator for Permutations < I >
12587where
12688 I : Iterator ,
@@ -129,10 +91,35 @@ where
12991 type Item = Vec < I :: Item > ;
13092
13193 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 } ;
133107
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+ }
135112
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 ;
136123 match * state {
137124 PermutationState :: StartUnknownLen { .. } => panic ! ( "unexpected iterator state" ) ,
138125 PermutationState :: OngoingUnknownLen { k, min_n } => {
0 commit comments