zcash-android-wallet-sdk/sdk-lib/src/main/java/cash/z/ecc/android/sdk/internal/Sma.kt

44 lines
1.2 KiB
Kotlin

package cash.z.ecc.android.sdk.internal
/**
* Simple implementation of Simple moving average.
*/
class Sma(val window: Int = 3) {
private val values = Array(window) { 0.0 }
var average = 0.0
private set
var count: Int = 0
var index: Int = 0
fun add(value: Number) = add(value.toDouble())
fun add(value: Double): Double {
when {
// full window
count == window -> {
index = (index + 1) % window
average += ((value - values[index]) / count.toFloat())
values[index] = value
}
// partially-filled window
count != 0 -> {
index = (index + 1) % window
average = ((value + count.toFloat() * average) / (count + 1).toFloat())
values[index] = value
count++
}
// empty window
else -> {
// simply assign given value as current average:
average = value
values[0] = value
count = 1
}
}
return average
}
fun format(places: Int = 0) = "%.${places}f".format(average)
}