code: func argChan(args []string) chan string {
  	ret := make(chan string)
  	go func() {
  		defer close(ret)
  
  		if len(args) > 0 {
  			for _, a := range args {
  				ret <- strings.TrimSpace(a)
  			}
  			return
  		}
  
  		reader := bufio.NewReader(os.Stdin)
  		for {
  			line, err := reader.ReadString('\n')
  			line = strings.TrimSpace(line)
  			switch {
  			case err == io.EOF:
  				return
  			case err != nil:
  				panic(err)
  			case len(line) == 0:
  				continue
  			default:
  				ret <- line
  			}
  		}
  	}()
  	return ret
  }
docs: // argChan returns a channel of args.
  //
  // If args is empty, reads from stdin. Trims whitespace and skips blank lines.
  // Panics if reading from stdin fails.