zcash-android-wallet-sdk/sdk-lib/src/main/java/cash/z/ecc/android/sdk/ext/BatchMetrics.kt

41 lines
1.5 KiB
Kotlin

package cash.z.ecc.android.sdk.ext
import cash.z.ecc.android.sdk.model.BlockHeight
import kotlin.math.max
import kotlin.math.min
class BatchMetrics(
val range: ClosedRange<BlockHeight>,
val batchSize: Int,
private val onMetricComplete: ((BatchMetrics, Boolean) -> Unit)? = null
) {
private var completedBatches = 0
private var rangeStartTime = 0L
private var batchStartTime = 0L
private var batchEndTime = 0L
private var rangeSize = range.endInclusive.value - range.start.value + 1
private fun now() = System.currentTimeMillis()
@Suppress("MagicNumber")
private fun ips(blocks: Long, time: Long) = 1000.0f * blocks / time
val isComplete get() = completedBatches * batchSize >= rangeSize
val isBatchComplete get() = batchEndTime > batchStartTime
val cumulativeItems get() = min(completedBatches * batchSize.toLong(), rangeSize)
val cumulativeTime get() = (if (isComplete) batchEndTime else now()) - rangeStartTime
val batchTime get() = max(batchEndTime - batchStartTime, now() - batchStartTime)
val batchItems get() = min(batchSize.toLong(), batchSize - (completedBatches * batchSize - rangeSize))
val batchIps get() = ips(batchItems, batchTime)
val cumulativeIps get() = ips(cumulativeItems, cumulativeTime)
fun beginBatch() {
batchStartTime = now()
if (rangeStartTime == 0L) rangeStartTime = batchStartTime
}
fun endBatch() {
completedBatches++
batchEndTime = now()
onMetricComplete?.invoke(this, isComplete)
}
}