blob: e1411a33467c16c0dea3c449cc9fdf975b9ccc94 [file] [log] [blame]
Rob Pikedb9002f2008-09-16 11:00:11 -07001// Copyright 2009 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package main
6
Rob Pikebdbb3b42009-03-18 14:09:16 -07007import "fmt"
8
Rob Pike783952132009-10-13 12:37:04 -07009// Send the sequence 2, 3, 4, ... to returned channel
Rob Pike293c8f82009-01-15 17:54:07 -080010func generate() chan int {
Rob Pike34356e92009-12-16 10:29:53 +110011 ch := make(chan int)
Mikio Haraab3365d2011-07-09 20:16:45 +100012 go func() {
Rob Pikedb9002f2008-09-16 11:00:11 -070013 for i := 2; ; i++ {
Rob Pike783952132009-10-13 12:37:04 -070014 ch <- i
Rob Pikedb9002f2008-09-16 11:00:11 -070015 }
Rob Pike34356e92009-12-16 10:29:53 +110016 }()
17 return ch
Rob Pikedb9002f2008-09-16 11:00:11 -070018}
19
20// Filter out input values divisible by 'prime', send rest to returned channel
Rob Pike293c8f82009-01-15 17:54:07 -080021func filter(in chan int, prime int) chan int {
Rob Pike34356e92009-12-16 10:29:53 +110022 out := make(chan int)
Rob Pike61028772009-08-13 08:54:26 -070023 go func() {
Rob Pikedb9002f2008-09-16 11:00:11 -070024 for {
Mikio Haraab3365d2011-07-09 20:16:45 +100025 if i := <-in; i%prime != 0 {
Rob Pike783952132009-10-13 12:37:04 -070026 out <- i
Rob Pikedb9002f2008-09-16 11:00:11 -070027 }
28 }
Rob Pike34356e92009-12-16 10:29:53 +110029 }()
30 return out
Rob Pikedb9002f2008-09-16 11:00:11 -070031}
32
Rob Pike293c8f82009-01-15 17:54:07 -080033func sieve() chan int {
Rob Pike34356e92009-12-16 10:29:53 +110034 out := make(chan int)
Rob Pike61028772009-08-13 08:54:26 -070035 go func() {
Rob Pike34356e92009-12-16 10:29:53 +110036 ch := generate()
Rob Pikedb9002f2008-09-16 11:00:11 -070037 for {
Rob Pike34356e92009-12-16 10:29:53 +110038 prime := <-ch
39 out <- prime
40 ch = filter(ch, prime)
Rob Pikedb9002f2008-09-16 11:00:11 -070041 }
Rob Pike34356e92009-12-16 10:29:53 +110042 }()
43 return out
Rob Pikedb9002f2008-09-16 11:00:11 -070044}
45
46func main() {
Rob Pike34356e92009-12-16 10:29:53 +110047 primes := sieve()
Rob Pike2ccd20a2011-04-27 09:59:27 -070048 for i := 0; i < 100; i++ { // Print the first hundred primes.
Rob Pike34356e92009-12-16 10:29:53 +110049 fmt.Println(<-primes)
Rob Pikedb9002f2008-09-16 11:00:11 -070050 }
51}