// Copyright (c) 2017, A. Stoewer <adrian.stoewer@rz.ifi.lmu.de>
// All rights reserved.

package strcase

import (
	
)

// UpperCamelCase converts a string into camel case starting with a upper case letter.
func ( string) string {
	return camelCase(, true)
}

// LowerCamelCase converts a string into camel case starting with a lower case letter.
func ( string) string {
	return camelCase(, false)
}

func camelCase( string,  bool) string {
	 = strings.TrimSpace()
	 := make([]rune, 0, len())

	stringIter(, func(, ,  rune) {
		if !isDelimiter() {
			if isDelimiter() || ( &&  == 0) {
				 = append(, toUpper())
			} else if isLower() {
				 = append(, )
			} else if isUpper() && isUpper() && isLower() {
				// Assume a case like "R" for "XRequestId"
				 = append(, )
			} else if isUpper() && isDigit() {
				// Preserve uppercase letters after numbers
				 = append(, )
			} else {
				 = append(, toLower())
			}
		}
	})

	return string()
}