code: func parallel(start, stop int, fn func(<-chan int)) {
  	count := stop - start
  	if count < 1 {
  		return
  	}
  
  	procs := runtime.GOMAXPROCS(0)
  	if procs > count {
  		procs = count
  	}
  
  	c := make(chan int, count)
  	for i := start; i < stop; i++ {
  		c <- i
  	}
  	close(c)
  
  	var wg sync.WaitGroup
  	for i := 0; i < procs; i++ {
  		wg.Add(1)
  		go func() {
  			defer wg.Done()
  			fn(c)
  		}()
  	}
  	wg.Wait()
  }
docs: // parallel processes the data in separate goroutines.