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  }