Skip to content

Instantly share code, notes, and snippets.

@wfxr
Last active April 18, 2021 10:34
Show Gist options
  • Save wfxr/23345701d5bc88c30cc038902b131713 to your computer and use it in GitHub Desktop.
Save wfxr/23345701d5bc88c30cc038902b131713 to your computer and use it in GitHub Desktop.
Primes
package main
import "fmt"
func main() {
for prime := range primes(100) {
fmt.Println(prime)
}
}
func filter(src chan int, prime int) chan int {
dest := make(chan int)
go func() {
defer close(dest)
for n := range src {
if n%prime != 0 {
dest <- n
}
}
}()
return dest
}
func generate() chan int {
dest := make(chan int)
go func() {
defer close(dest)
for n := 2; ; n++ {
dest <- n
}
}()
return dest
}
func primes(n int) chan int {
src := generate()
primes := make(chan int)
go func() {
defer close(primes)
for i := 0; i < n; i++ {
prime := <-src
primes <- prime
src = filter(src, prime)
}
}()
return primes
}
#![feature(generators, generator_trait)]
use std::{ops::{Generator, GeneratorState}, pin::Pin};
pub fn nth(n: u32) -> u32 {
let mut seq : Box<dyn Iterator<Item = u32>> = Box::new(2..);
for _ in 0..n {
let prime = seq.next().unwrap();
seq = filter(seq, prime);
}
seq.next().unwrap()
}
fn filter(src: Box<dyn Iterator<Item = u32>>, prime: u32) -> Box<dyn Iterator<Item = u32>> {
Box::new(src.filter(move |n| n % prime != 0))
}
fn main() {
let mut primes = || {
let mut seq: Box<dyn Iterator<Item = u32>> = Box::new(2..);
loop {
let prime = seq.next().unwrap();
yield prime;
seq = filter(seq, prime);
}
};
for _ in 0..10 {
match Pin::new(&mut primes).resume(()) {
GeneratorState::Yielded(prime) => {
println!("{}", prime)
}
_ => panic!("unexpected")
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment