Skip to content

Commit 93730e1

Browse files
committed
Simplify Permutations (1.2) inline Permutations::advance
This at least makes clear why the panic! in Permutations::next cannot happen.
1 parent 30512ca commit 93730e1

File tree

1 file changed

+27
-40
lines changed

1 file changed

+27
-40
lines changed

src/permutations.rs

Lines changed: 27 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
12486
impl<I> Iterator for Permutations<I>
12587
where
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

Comments
 (0)