package prime func gen() (chan int, chan bool) { stop := make(chan bool) ch := make(chan int) go func() { defer close(ch) for i := 2; ; i++ { select { case ch <- i: case <-stop: return } } }() return ch, stop } func filter(in chan int, prime int) chan int { ch := make(chan int) go func() { defer close(ch) for i := range in { if i%prime != 0 { ch <- i } } }() return ch } func Nth(n int) (int, bool) { if n < 1 { return 0, false } ch, stop := gen() defer func() { stop <- true }() for i := 1; i < n; i++ { ch = filter(ch, <-ch) } return <-ch, true }