blob: 0ae3893ab7a542a2cde2ed9767c8cb5f56ad7774 [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 Pikedb9002f2008-09-16 11:00:11 -07009// Send the sequence 2, 3, 4, ... to returned channel
Rob Pike293c8f82009-01-15 17:54:07 -080010func generate() chan int {
Rob Pike8d210042009-01-06 15:49:27 -080011 ch := make(chan int);
Rob Pike61028772009-08-13 08:54:26 -070012 go func(){
Rob Pikedb9002f2008-09-16 11:00:11 -070013 for i := 2; ; i++ {
Rob Pike592d2e32008-09-16 19:40:38 -070014 ch <- i
Rob Pikedb9002f2008-09-16 11:00:11 -070015 }
Rob Pike61028772009-08-13 08:54:26 -070016 }();
Rob Pikedb9002f2008-09-16 11:00:11 -070017 return ch;
18}
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 Pike8d210042009-01-06 15:49:27 -080022 out := make(chan int);
Rob Pike61028772009-08-13 08:54:26 -070023 go func() {
Rob Pikedb9002f2008-09-16 11:00:11 -070024 for {
25 if i := <-in; i % prime != 0 {
Rob Pike592d2e32008-09-16 19:40:38 -070026 out <- i
Rob Pikedb9002f2008-09-16 11:00:11 -070027 }
28 }
Rob Pike61028772009-08-13 08:54:26 -070029 }();
Rob Pikedb9002f2008-09-16 11:00:11 -070030 return out;
31}
32
Rob Pike293c8f82009-01-15 17:54:07 -080033func sieve() chan int {
Rob Pike8d210042009-01-06 15:49:27 -080034 out := make(chan int);
Rob Pike61028772009-08-13 08:54:26 -070035 go func() {
Rob Pike293c8f82009-01-15 17:54:07 -080036 ch := generate();
Rob Pikedb9002f2008-09-16 11:00:11 -070037 for {
38 prime := <-ch;
Rob Pike592d2e32008-09-16 19:40:38 -070039 out <- prime;
Rob Pike293c8f82009-01-15 17:54:07 -080040 ch = filter(ch, prime);
Rob Pikedb9002f2008-09-16 11:00:11 -070041 }
Rob Pike61028772009-08-13 08:54:26 -070042 }();
Rob Pikedb9002f2008-09-16 11:00:11 -070043 return out;
44}
45
46func main() {
Rob Pike293c8f82009-01-15 17:54:07 -080047 primes := sieve();
Rob Pikedb9002f2008-09-16 11:00:11 -070048 for {
Rob Pikebdbb3b42009-03-18 14:09:16 -070049 fmt.Println(<-primes);
Rob Pikedb9002f2008-09-16 11:00:11 -070050 }
51}