diff options
author | Linnea Gräf <nea@nea.moe> | 2024-08-28 19:04:24 +0200 |
---|---|---|
committer | Linnea Gräf <nea@nea.moe> | 2024-08-28 19:04:24 +0200 |
commit | d2f240ff0ca0d27f417f837e706c781a98c31311 (patch) | |
tree | 0db7aff6cc14deaf36eed83889d59fd6b3a6f599 /src/main/kotlin/moe/nea/firmament/features/mining/Histogram.kt | |
parent | a6906308163aa3b2d18fa1dc1aa71ac9bbcc83ab (diff) | |
download | Firmament-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.kt | 81 |
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() - } - - -} |