Skip to content

Instantly share code, notes, and snippets.

@stnbu
Created August 29, 2022 18:45
Show Gist options
  • Save stnbu/559e0ca5c4cde51b46e6d0892d7e3200 to your computer and use it in GitHub Desktop.
Save stnbu/559e0ca5c4cde51b46e6d0892d7e3200 to your computer and use it in GitHub Desktop.
A decent result after thinking about primes forever and not looking at the book
struct Sieve<'a> {
primes: &'a mut Vec<u32>,
}
impl<'a> Sieve<'a> {
pub fn new(primes: &'a mut Vec<u32>) -> Self {
Sieve { primes }
}
}
impl Iterator for Sieve<'_> {
type Item = u32;
fn next(&mut self) -> Option<Self::Item> {
let last = self.primes.last();
if last == None {
self.primes.push(2);
return Some(2);
}
for n in last.unwrap() + 1.. {
let mut isprime = true;
for p in self.primes.iter() {
if n % p == 0 {
isprime = false;
break;
}
}
if isprime {
self.primes.push(n);
return Some(n);
}
}
None
}
}
fn main() {
let mut primes = Vec::from([]);
let mut x = Sieve::new(&mut primes);
for _ in 0..5 {
match x.next() {
Some(n) => println!(">>>{}", n),
None => {
println!("WHAAAT!!");
break;
}
}
}
println!("Hello, world!");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment