|
| 1 | +//go:generate go run ../../codegen/main.go -tpl=fanin -type=int |
| 2 | +//go:generate go run ../../codegen/main.go -tpl=repeatfn -type=int |
| 3 | +//go:generate go run ../../codegen/main.go -tpl=take -type=int |
1 | 4 | package main
|
2 | 5 |
|
3 | 6 | import (
|
4 |
| - "concurrency/patterns/fanin" |
5 | 7 | "fmt"
|
6 | 8 | "math/rand"
|
7 | 9 | "runtime"
|
8 | 10 | "time"
|
9 |
| - |
10 |
| - "concurrency/patterns/generators" |
11 |
| -) |
12 |
| - |
13 |
| -var ( |
14 |
| - take = generators.Take |
15 |
| - toInt = generators.ToInt |
16 |
| - repeatFn = generators.RepeatFn |
17 | 11 | )
|
18 | 12 |
|
| 13 | +// before running main.go, make sure to run: |
| 14 | +// go generate main.go |
19 | 15 | func main() {
|
20 | 16 | done := make(chan struct{})
|
21 | 17 | defer close(done)
|
22 |
| - random := func() interface{} { |
| 18 | + random := func() int { |
23 | 19 | return rand.Intn(50000000)
|
24 | 20 | }
|
25 | 21 | start := time.Now()
|
26 |
| - randIntStream := toInt(done, repeatFn(done, random)) |
| 22 | + randIntStream := RepeatFn(done, random) |
27 | 23 | numFinders := runtime.NumCPU()
|
28 | 24 | finders := make([]<-chan int, numFinders)
|
29 | 25 | for i := 0; i < numFinders; i++ {
|
30 |
| - finders[i] = toInt(done, primeFinder(done, randIntStream)) |
| 26 | + finders[i] = primeFinder(done, randIntStream) |
31 | 27 | }
|
32 | 28 |
|
33 | 29 | fmt.Println("primes:")
|
34 |
| - for prime := range take(done, fanin.FanIn(done, finders...), 10) { |
| 30 | + for prime := range Take(done, FanIn(done, finders...), 10) { |
35 | 31 | fmt.Println("prime:", prime)
|
36 | 32 | }
|
37 | 33 | fmt.Printf("search took: %v", time.Since(start))
|
38 | 34 | }
|
39 | 35 |
|
40 |
| -func primeFinder(done <-chan struct{}, intStream <-chan int) <-chan interface{} { |
41 |
| - primeStream := make(chan interface{}) |
| 36 | +func primeFinder(done <-chan struct{}, intStream <-chan int) <-chan int { |
| 37 | + primeStream := make(chan int) |
42 | 38 | go func() {
|
43 | 39 | defer close(primeStream)
|
44 | 40 | for integer := range intStream {
|
|
0 commit comments