code: func MakeStreamName(fill string, s ...string) (StreamName, error) {
  	if len(s) == 0 {
  		return "", errors.New("at least one segment must be provided")
  	}
  
  	fillValidated := false
  	for idx, v := range s {
  		v = strings.Map(func(r rune) rune {
  			switch {
  			case r >= 'A' && r <= 'Z':
  				fallthrough
  			case r >= 'a' && r <= 'z':
  				fallthrough
  			case r >= '0' && r <= '9':
  				fallthrough
  			case r == '.':
  				fallthrough
  			case r == '_':
  				fallthrough
  			case r == '-':
  				fallthrough
  			case r == ':':
  				return r
  
  			default:
  				return '_'
  			}
  		}, v)
  		if r, _ := utf8.DecodeRuneInString(v); !isAlnum(r) {
  			// We will prepend the fill sequence to make this a valid stream name.
  			// We only need to validate this sequence once.
  			if !fillValidated {
  				if err := StreamName(fill).Validate(); err != nil {
  					return "", fmt.Errorf("fill string must be a valid stream name: %s", err)
  				}
  				fillValidated = true
  			}
  
  			v = fill + v
  		}
  		s[idx] = v
  	}
  	result := StreamName(Construct(s...))
  	if err := result.Validate(); err != nil {
  		return "", err
  	}
  	return result, nil
  }
docs: // MakeStreamName constructs a new stream name from its segments.
  //
  // This method is guaranteed to return a valid stream name. In order to ensure
  // that the arbitrary input can meet this standard, the following
  // transformations will be applied as needed:
  // - If the segment doesn't begin with an alphanumeric character, the fill
  //   string will be prepended.
  // - Any character disallowed in the segment will be replaced with an
  //   underscore. This includes segment separators within a segment string.
  //
  // An empty string can be passed for "fill" to just error if a replacement is
  // needed.