aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/moe/nea/ledger/DebouncedValue.kt
diff options
context:
space:
mode:
authorLinnea Gräf <nea@nea.moe>2024-12-28 15:52:17 +0100
committerLinnea Gräf <nea@nea.moe>2024-12-28 15:52:17 +0100
commitc82d0b07033e02f7a6a23adbc1607ab3d41afdad (patch)
treebb48f950d7c4ed1ca96e087824ab6653500e0de4 /src/main/kotlin/moe/nea/ledger/DebouncedValue.kt
parent4d0de990e38632da9ad5c8b2d6ff90d259b2fcc6 (diff)
downloadLocalTransactionLedger-c82d0b07033e02f7a6a23adbc1607ab3d41afdad.tar.gz
LocalTransactionLedger-c82d0b07033e02f7a6a23adbc1607ab3d41afdad.tar.bz2
LocalTransactionLedger-c82d0b07033e02f7a6a23adbc1607ab3d41afdad.zip
feat: Add draonic sacrifice tracker
Diffstat (limited to 'src/main/kotlin/moe/nea/ledger/DebouncedValue.kt')
-rw-r--r--src/main/kotlin/moe/nea/ledger/DebouncedValue.kt38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/main/kotlin/moe/nea/ledger/DebouncedValue.kt b/src/main/kotlin/moe/nea/ledger/DebouncedValue.kt
new file mode 100644
index 0000000..66fba8d
--- /dev/null
+++ b/src/main/kotlin/moe/nea/ledger/DebouncedValue.kt
@@ -0,0 +1,38 @@
+package moe.nea.ledger
+
+import kotlin.time.Duration
+import kotlin.time.Duration.Companion.nanoseconds
+import kotlin.time.Duration.Companion.seconds
+
+class DebouncedValue<T>(private val value: T) {
+ companion object {
+ fun <T> farFuture(): DebouncedValue<T> {
+ val value = DebouncedValue(Unit)
+ value.take()
+ @Suppress("UNCHECKED_CAST")
+ return value as DebouncedValue<T>
+ }
+ }
+
+ val lastSeenAt = System.nanoTime()
+ val age get() = (System.nanoTime() - lastSeenAt).nanoseconds
+ var taken = false
+ private set
+
+ fun get(debounce: Duration): T? {
+ return if (!taken && age >= debounce) value
+ else null
+ }
+
+ fun replace(): T? {
+ return consume(0.seconds)
+ }
+
+ fun consume(debounce: Duration): T? {
+ return get(debounce)?.also { take() }
+ }
+
+ fun take() {
+ taken = true
+ }
+} \ No newline at end of file