code: func Do(timeout time.Duration, operation DoCondition) error {
  	if timeout <= 0 {
  		panic("timeout must be larger than zero")
  	}
  
  	interval := time.Duration(math.Ceil(float64(timeout) / 15.0))
  	if interval > maxInterval {
  		interval = maxInterval
  	}
  
  	timeout = applyCIMultiplier(timeout)
  
  	var err error
  	if err = operation(); err == nil {
  		fmt.Println("+")
  		return nil
  	}
  	fmt.Print("*")
  
  	stopTimer := time.NewTimer(timeout)
  	defer stopTimer.Stop()
  	retryTick := time.NewTicker(interval)
  	defer retryTick.Stop()
  
  	for {
  		select {
  		case <-stopTimer.C:
  			fmt.Println("-")
  			return fmt.Errorf("try operation failed: %s", err)
  		case <-retryTick.C:
  			fmt.Print("*")
  			if err = operation(); err == nil {
  				fmt.Println("+")
  				return err
  			}
  		}
  	}
  }
docs: // Do repeatedly executes an operation until no error condition occurs or the
  // given timeout is reached, whatever comes first.