Skip to content

Commit 30512ca

Browse files
committed
Simplify Permutations (1.1) move impl Permutations
This simply moves code around so that the subsequent diff is simpler.
1 parent 58a25fb commit 30512ca

File tree

1 file changed

+38
-38
lines changed

1 file changed

+38
-38
lines changed

src/permutations.rs

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
86124
impl<I> Iterator for Permutations<I>
87125
where
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-
200200
impl CompleteState {
201201
fn advance(&mut self) {
202202
*self = match *self {

0 commit comments

Comments
 (0)