aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/moe/nea/firmament/features/mining/Histogram.kt
diff options
context:
space:
mode:
authorLinnea Gräf <nea@nea.moe>2024-08-28 19:04:24 +0200
committerLinnea Gräf <nea@nea.moe>2024-08-28 19:04:24 +0200
commitd2f240ff0ca0d27f417f837e706c781a98c31311 (patch)
tree0db7aff6cc14deaf36eed83889d59fd6b3a6f599 /src/main/kotlin/moe/nea/firmament/features/mining/Histogram.kt
parenta6906308163aa3b2d18fa1dc1aa71ac9bbcc83ab (diff)
downloadFirmament-d2f240ff0ca0d27f417f837e706c781a98c31311.tar.gz
Firmament-d2f240ff0ca0d27f417f837e706c781a98c31311.tar.bz2
Firmament-d2f240ff0ca0d27f417f837e706c781a98c31311.zip
Refactor source layout
Introduce compat source sets and move all kotlin sources to the main directory [no changelog]
Diffstat (limited to 'src/main/kotlin/moe/nea/firmament/features/mining/Histogram.kt')
-rw-r--r--src/main/kotlin/moe/nea/firmament/features/mining/Histogram.kt81
1 files changed, 0 insertions, 81 deletions
diff --git a/src/main/kotlin/moe/nea/firmament/features/mining/Histogram.kt b/src/main/kotlin/moe/nea/firmament/features/mining/Histogram.kt
deleted file mode 100644
index ed48437..0000000
--- a/src/main/kotlin/moe/nea/firmament/features/mining/Histogram.kt
+++ /dev/null
@@ -1,81 +0,0 @@
-
-package moe.nea.firmament.features.mining
-
-import java.util.*
-import kotlin.time.Duration
-import moe.nea.firmament.util.TimeMark
-
-class Histogram<T>(
- val maxSize: Int,
- val maxDuration: Duration,
-) {
-
- data class OrderedTimestamp(val timestamp: TimeMark, val order: Int) : Comparable<OrderedTimestamp> {
- override fun compareTo(other: OrderedTimestamp): Int {
- val o = timestamp.compareTo(other.timestamp)
- if (o != 0) return o
- return order.compareTo(other.order)
- }
- }
-
- val size: Int get() = dataPoints.size
- private val dataPoints: NavigableMap<OrderedTimestamp, T> = TreeMap()
-
- private var order = Int.MIN_VALUE
-
- fun record(entry: T, timestamp: TimeMark = TimeMark.now()) {
- dataPoints[OrderedTimestamp(timestamp, order++)] = entry
- trim()
- }
-
- fun oldestUpdate(): TimeMark {
- trim()
- return if (dataPoints.isEmpty()) TimeMark.now() else dataPoints.firstKey().timestamp
- }
-
- fun latestUpdate(): TimeMark {
- trim()
- return if (dataPoints.isEmpty()) TimeMark.farPast() else dataPoints.lastKey().timestamp
- }
-
- fun averagePer(valueExtractor: (T) -> Double, perDuration: Duration): Double? {
- return aggregate(
- seed = 0.0,
- operator = { accumulator, entry, _ -> accumulator + valueExtractor(entry) },
- finish = { sum, beginning, end ->
- val timespan = end - beginning
- if (timespan > perDuration)
- sum / (timespan / perDuration)
- else null
- })
- }
-
- fun <V, R> aggregate(
- seed: V,
- operator: (V, T, TimeMark) -> V,
- finish: (V, TimeMark, TimeMark) -> R
- ): R? {
- trim()
- var accumulator = seed
- var min: TimeMark? = null
- var max: TimeMark? = null
- dataPoints.forEach { (key, value) ->
- max = key.timestamp
- if (min == null)
- min = key.timestamp
- accumulator = operator(accumulator, value, key.timestamp)
- }
- if (min == null)
- return null
- return finish(accumulator, min!!, max!!)
- }
-
- private fun trim() {
- while (maxSize < dataPoints.size) {
- dataPoints.pollFirstEntry()
- }
- dataPoints.headMap(OrderedTimestamp(TimeMark.ago(maxDuration), Int.MAX_VALUE)).clear()
- }
-
-
-}