package filter

func FilterByType(t int, arr []float64, init float64) float64 {
	switch t {
	case 0:
		return AlphaBeta(arr, init)
	case 1:
		return Lag_1(arr, init)
	case 2:
		return Lag_2(arr, init)
	case 3:
		return Lag_3(arr, init)
	}

	return AlphaBeta(arr, init)
}

func AlphaBeta(arr []float64, init float64) float64 {

	value := init
	for i := range arr {
		gain := 1.0 / (float64(i + 1))
		value += (gain*arr[i] - value)
	}
	return value
}

// Simple lag filter. value = old * 0.9 + new * 0.1
func Lag_1(arr []float64, init float64) float64 {
	value := init
	for i := range arr {
		value = value*0.9 + arr[i]*0.1
	}

	return value
}

// Simple lag filter. value = old * 0.95 + new * 0.05
func Lag_2(arr []float64, init float64) float64 {
	value := init
	for i := range arr {
		value = value*0.95 + arr[i]*0.05
	}

	return value
}

// Simple lag filter. value = old * 0.99 + new * 0.01
func Lag_3(arr []float64, init float64) float64 {
	value := init
	for i := range arr {
		value = value*0.99 + arr[i]*0.01
	}

	return value
}