package geom

import "math"

func emulate32(f float32, fn func(float64) float64) float32 {
	return float32(fn(float64(f)))
}

// Abs returns the absolute value.
func Abs(f float64) float64 {
	return math.Abs(f)
}

// Abs32 returns the absolute value.
func Abs32(f float32) float32 {
	return float32(Abs(float64(f)))
}

// Atan returns the arctangent of f.
func Atan(f float64) float64 {
	return math.Atan(f)
}

// Atan32 returns the arctangent of f.
func Atan32(f float32) float32 {
	return float32(math.Atan(float64(f)))
}

// Ceil rounds f up to an natural number.
func Ceil(f float64) float64 {
	return math.Ceil(f)
}

// Ceil32 rounds f up to an natural number.
func Ceil32(f float32) float32 { return emulate32(f, math.Ceil) }

// Cos returns the cosine of f.
func Cos(f float64) float64 {
	return math.Cos(f)
}

// Cos32 returns the cosine of f.
func Cos32(f float32) float32 {
	return float32(math.Cos(float64(f)))
}

// Floor rounds f down to an natural number.
func Floor(f float64) float64 {
	return math.Floor(f)
}

// Floor32 rounds f down to an natural number.
func Floor32(f float32) float32 { return emulate32(f, math.Floor) }

// IsNaN checks if the floating point number is not a number.
func IsNaN(f float64) bool {
	return f != f
}

// IsNaN32 checks if the floating point number is not a number.
func IsNaN32(f float32) bool {
	return f != f
}

// Max the maximum of the two values.
func Max(a, b float64) float64 {
	return math.Max(a, b)
}

// Max32 the maximum of the two values.
func Max32(a, b float32) float32 {
	return float32(math.Max(float64(a), float64(b)))
}

// Min the minimum of the two values.
func Min(a, b float64) float64 {
	return math.Min(a, b)
}

// Min32 the minimum of the two values.
func Min32(a, b float32) float32 {
	return float32(math.Min(float64(a), float64(b)))
}

// NaN returns not a floating point number.
func NaN() float64 {
	return math.NaN()
}

// NaN32 returns not a floating point number.
func NaN32() float32 {
	return float32(NaN())
}

// Pow returns the power e of base b.
func Pow(b, e float64) float64 {
	return math.Pow(b, e)
}

// Pow32 returns the power e of base b.
func Pow32(b, e float32) float32 {
	return float32(Pow(float64(b), float64(e)))
}

// Round rounds to the nearest integer.
func Round(f float64) float64 {
	return math.Round(f)
}

// Round32 rounds to the nearest integer.
func Round32(f float32) float32 {
	return float32(math.Round(float64(f)))
}

// Sin returns the sine of f.
func Sin(f float64) float64 {
	return math.Sin(f)
}

// Sin32 returns the sine of f.
func Sin32(f float32) float32 {
	return float32(math.Sin(float64(f)))
}

// Sq returns the squared value of f.
func Sq(f float64) float64 {
	return f * f
}

// Sq32 returns the squared value of f.
func Sq32(f float32) float32 {
	return f * f
}

// Sqrt the square root of the value.
func Sqrt(f float64) float64 {
	return math.Sqrt(f)
}

// Sqrt32 the square root of the value.
func Sqrt32(f float32) float32 {
	return float32(Sqrt(float64(f)))
}

// Tan returns the tangent of f.
func Tan(f float64) float64 {
	return math.Tan(f)
}

// Tan32 returns the tangent of f.
func Tan32(f float32) float32 {
	return float32(math.Tan(float64(f)))
}