| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 | package kata// Based on the Go classical concurrent prime sieve// See https://golang.org/test/chan/sieve1.gofunc Primes(limit int) []int {	// Generate numbers from 2 to limit, included.	gen := func(ch chan<- int, limit int) {		for i := 2; i <= limit; i++ {			ch <- i		}		close(ch)	}	// Remove divisible numbers	//  - in: numbers source	//  - out: numbers sink	//  - prime: prime by which to attempt modulo	filter := func(in <-chan int, out chan<- int, prime int) {		for {			candidate, ok := <-in			// Source was closed.			if !ok {				break			}			if candidate%prime != 0 {				out <- candidate			}		}		close(out)	}	genChan := make(chan int)	go gen(genChan, limit)	var primes []int	for i := 0; ; i++ {		prime, ok := <-genChan		if !ok {			break		}		primes = append(primes, prime)		filterChan := make(chan int)		go filter(genChan, filterChan, prime)		genChan = filterChan	}	return primes}
 |