use crate::num::exhaustive::PrimitiveIntIncreasingRange;
use crate::rational_sequences::{RationalSequence, rational_sequence_is_reduced};
use crate::tuples::exhaustive::{ExhaustivePairs1Input, exhaustive_pairs_from_single};
use crate::vecs::exhaustive::{ExhaustiveVecs, exhaustive_vecs};
#[derive(Clone, Debug)]
pub struct ExhaustiveRationalSequences<I: Clone + Iterator>(
ExhaustivePairs1Input<ExhaustiveVecs<I::Item, PrimitiveIntIncreasingRange<u64>, I>>,
)
where
I::Item: Clone;
impl<I: Clone + Iterator> Iterator for ExhaustiveRationalSequences<I>
where
I::Item: Clone + Eq,
{
type Item = RationalSequence<I::Item>;
fn next(&mut self) -> Option<RationalSequence<I::Item>> {
loop {
let (non_repeating, repeating) = self.0.next()?;
if rational_sequence_is_reduced(&non_repeating, &repeating) {
return Some(RationalSequence {
non_repeating,
repeating,
});
}
}
}
}
pub fn exhaustive_rational_sequences<I: Clone + Iterator>(xs: I) -> ExhaustiveRationalSequences<I>
where
I::Item: Clone + Eq,
{
ExhaustiveRationalSequences(exhaustive_pairs_from_single(exhaustive_vecs(xs)))
}