package matchr import ( "math" "strings" ) // min of two integers func min(a int, b int) (res int) { if a < b { res = a } else { res = b } return } // max of two integers func maxI(a int, b int) (res int) { if a < b { res = b } else { res = a } return } // max of two float64s func max(a float64, b float64) (res float64) { if a < b { res = b } else { res = a } return } // is this string index outside of the ASCII numeric code points? func nan(c rune) bool { return ((c > 57) || (c < 48)) } // Round a float64 to the given precision // // http://play.golang.org/p/S654PxAe_N // // (via Rory McGuire at // https://groups.google.com/forum/#!topic/golang-nuts/ITZV08gAugI) func round(x float64, prec int) float64 { if math.IsNaN(x) || math.IsInf(x, 0) { return x } sign := 1.0 if x < 0 { sign = -1 x *= -1 } var rounder float64 pow := math.Pow(10, float64(prec)) intermed := x * pow _, frac := math.Modf(intermed) if frac >= 0.5 { rounder = math.Ceil(intermed) } else { rounder = math.Floor(intermed) } return rounder / pow * sign } // A helper to determine if any substrings exist within the given string func contains(value *String, start int, length int, criteria ...string) bool { substring := substring(value, start, length) for _, c := range criteria { if substring == c { return true } } return false } // A fault-tolerant version of Slice. It will return nothing ("") if the index // is out of bounds. This allows substring-ing without having to bound check // every time. func substring(value *String, start int, length int) string { if start >= 0 && start+length <= value.RuneCount() { return value.Slice(start, start+length) } else { return "" } } func isVowel(c rune) bool { switch c { case 'A', 'E', 'I', 'O', 'U', 'Y': return true default: return false } } func isVowelNoY(c rune) bool { switch c { case 'A', 'E', 'I', 'O', 'U': return true default: return false } } func cleanInput(input string) string { return strings.ToUpper(strings.TrimSpace(input)) }