summaryrefslogtreecommitdiff
path: root/doc/progs/sieve1.go
diff options
context:
space:
mode:
Diffstat (limited to 'doc/progs/sieve1.go')
-rw-r--r--doc/progs/sieve1.go49
1 files changed, 49 insertions, 0 deletions
diff --git a/doc/progs/sieve1.go b/doc/progs/sieve1.go
new file mode 100644
index 000000000..2cb90600b
--- /dev/null
+++ b/doc/progs/sieve1.go
@@ -0,0 +1,49 @@
+// 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");
+ }
+}