// 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"); } }