package mathext

import "gogs.mikescher.com/BlackForestBytes/goext/langext"

func AvgFloat64(arr []float64) float64 {
	return SumFloat64(arr) / float64(len(arr))
}

func SumFloat64(arr []float64) float64 {
	sum := 0.0
	for _, v := range arr {
		sum += v
	}
	return sum
}

func Max[T langext.OrderedConstraint](v1 T, v2 T) T {
	if v1 > v2 {
		return v1
	} else {
		return v2
	}
}

func Max3[T langext.OrderedConstraint](v1 T, v2 T, v3 T) T {
	result := v1
	if v2 > result {
		result = v2
	}
	if v3 > result {
		result = v3
	}
	return result
}

func Max4[T langext.OrderedConstraint](v1 T, v2 T, v3 T, v4 T) T {
	result := v1
	if v2 > result {
		result = v2
	}
	if v3 > result {
		result = v3
	}
	if v4 > result {
		result = v4
	}
	return result
}

func Min[T langext.OrderedConstraint](v1 T, v2 T) T {
	if v1 < v2 {
		return v1
	} else {
		return v2
	}
}

func Min3[T langext.OrderedConstraint](v1 T, v2 T, v3 T) T {
	result := v1
	if v2 < result {
		result = v2
	}
	if v3 < result {
		result = v3
	}
	return result
}

func Min4[T langext.OrderedConstraint](v1 T, v2 T, v3 T, v4 T) T {
	result := v1
	if v2 < result {
		result = v2
	}
	if v3 < result {
		result = v3
	}
	if v4 < result {
		result = v4
	}
	return result
}

func Abs[T langext.NumberConstraint](v T) T {
	if v < 0 {
		return -v
	} else {
		return v
	}
}

func Clamp[T langext.NumberConstraint](v T, min T, max T) T {
	if v < min {
		return min
	} else if v > max {
		return max
	} else {
		return v
	}
}
