// Copyright 2009 The Go Authors. All rights reserved. | |
// Use of this source code is governed by a BSD-style | |
// license that can be found in the LICENSE file. | |
package main | |
// Send the sequence 2, 3, 4, ... to returned channel | |
func Generate() *chan int { | |
ch := new(chan int); | |
go func(ch *chan int){ | |
for i := 2; ; i++ { | |
ch <- i | |
} | |
}(ch); | |
return ch; | |
} | |
// Filter out input values divisible by 'prime', send rest to returned channel | |
func Filter(in *chan int, prime int) *chan int { | |
out := new(chan int); | |
go func(in *chan int, out *chan int, prime int) { | |
for { | |
if i := <-in; i % prime != 0 { | |
out <- i | |
} | |
} | |
}(in, out, prime); | |
return out; | |
} | |
func Sieve() *chan int { | |
out := new(chan int); | |
go func(out *chan int) { | |
ch := Generate(); | |
for { | |
prime := <-ch; | |
out <- prime; | |
ch = Filter(ch, prime); | |
} | |
}(out); | |
return out; | |
} | |
func main() { | |
primes := Sieve(); | |
for { | |
print(<-primes, "\n"); | |
} | |
} |