package graphite

import (
	"strconv"
)

func naturalLess(a, b string) bool {
	for {
		var aPrefix, bPrefix string
		aPrefix, a = getNonNumPrefix(a)
		bPrefix, b = getNonNumPrefix(b)
		if aPrefix != bPrefix {
			return aPrefix < bPrefix
		}
		if len(a) == 0 || len(b) == 0 {
			return a < b
		}
		var aNum, bNum int
		aNum, a = getNumPrefix(a)
		bNum, b = getNumPrefix(b)
		if aNum != bNum {
			return aNum < bNum
		}
	}
}

func getNonNumPrefix(s string) (prefix string, tail string) {
	for i := 0; i < len(s); i++ {
		ch := s[i]
		if ch >= '0' && ch <= '9' {
			return s[:i], s[i:]
		}
	}
	return s, ""
}

func getNumPrefix(s string) (prefix int, tail string) {
	i := 0
	for i < len(s) {
		ch := s[i]
		if ch < '0' || ch > '9' {
			break
		}
		i++
	}
	prefix, _ = strconv.Atoi(s[:i])
	return prefix, s[i:]
}