use std::cmp::Ordering; use std::iter::Peekable; fn powers(m: u32) -> impl Iterator { (0u64..).map(move |x| x.pow(m)) } fn noncubic_squares() -> impl Iterator { NoncubicSquares { squares: powers(2).peekable(), cubes: powers(3).peekable(), } } struct NoncubicSquares, U: Iterator> { squares: Peekable, cubes: Peekable, } impl, U: Iterator> Iterator for NoncubicSquares { type Item = u64; fn next(&mut self) -> Option { loop { match self.squares.peek()?.cmp(self.cubes.peek()?) { Ordering::Equal => self.squares.next(), Ordering::Greater => self.cubes.next(), Ordering::Less => return self.squares.next(), }; } } } fn main() { noncubic_squares() .skip(20) .take(10) .for_each(|x| print!("{} ", x)); println!(); }