github.com/l3x/learn-fp-go@v0.0.0-20171228022418-7639825d0b71/1-functional-fundamentals/ch03-hof/03_hof/src/hof/generator.go (about) 1 package hof 2 3 import ( 4 "sync" 5 "log" 6 ) 7 8 9 func carGenerator(iterator func(int) int, lower int, upper int) func() (int, bool) { 10 return func() (int, bool) { 11 lower = iterator(lower) 12 return lower, lower > upper 13 } 14 } 15 16 func iterator(i int) int { 17 i += 1 18 return i 19 } 20 21 func (cars Collection) GenerateCars(start, limit int) Collection { 22 23 carChannel := make(chan *IndexedCar) 24 25 var waitGroup sync.WaitGroup 26 27 numCarsToGenerate := start + limit - 1 28 generatedCars := Collection{} 29 30 waitGroup.Add(numCarsToGenerate) 31 32 next := carGenerator(iterator, start -1, numCarsToGenerate) 33 34 carIndex, done := next() 35 for !done { 36 go func(carIndex int) { 37 thisCar, err := GetThisCar(carIndex) 38 //log.Printf("GetThisCar(%v): %v\n", carIndex, thisCar) 39 if err != nil { 40 panic(err) 41 } 42 carChannel <- thisCar 43 generatedCars = append(generatedCars, thisCar.Car) 44 waitGroup.Done() 45 }(carIndex) 46 47 carIndex, done = next() 48 } 49 50 go func() { 51 waitGroup.Wait() 52 close(carChannel) 53 }() 54 55 printCars(carChannel, start, limit) 56 return generatedCars 57 } 58 59 func printCars(indexedCars chan *IndexedCar, start, limit int) { 60 log.Printf("\nGenerated Cars (%d to %d)\n%s\n", start, start + limit, DASHES) 61 var cars Collection 62 for car := range indexedCars { 63 log.Printf("car: %s\n", car.Car) 64 cars = append(cars, car.Car) 65 } 66 }