Skip to content

Instantly share code, notes, and snippets.

@nanpuyue
Last active August 1, 2020 03:08
Embed
What would you like to do?
// date: 2019-01-10
// license: GPLv3 https://www.gnu.org/licenses/gpl-3.0.txt
// author: nanpuyue <nanpuyue@gmail.com> https://blog.nanpuyue.com
#![feature(generators)]
#![feature(generator_trait)]
use std::ops::{Generator, GeneratorState};
use std::pin::Pin;
fn new_prime_generator() -> impl Generator<Yield = u8, Return = ()> {
|| {
yield 2;
yield 3;
let mut list = vec![3];
let mut last = 5u8;
loop {
for i in list.iter().copied() {
let (q, r) = (last / i, last % i);
if i > q {
list.push(last);
yield last;
break;
}
if r == 0 {
break;
}
}
last = last.wrapping_add(2);
if last == 1 {
return;
}
}
}
}
fn main() {
let mut prime_generator = new_prime_generator();
while let GeneratorState::Yielded(n) = Pin::new(&mut prime_generator).resume(()) {
println!("{}", n);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment