27 lines
879 B
Kotlin
27 lines
879 B
Kotlin
package net.sergecyh.diwan.tools
|
|
|
|
import kotlin.time.Clock
|
|
import kotlin.time.Duration
|
|
import kotlin.time.Instant
|
|
|
|
/**
|
|
* Experimental.
|
|
*
|
|
* limit invocations rate of [invoke] to once per [minimalInterval] or less frequent.
|
|
* Note that it is not a debouncing, it just ignores too frequent calls!
|
|
*/
|
|
@Suppress("unused")
|
|
class RateLimiter(val minimalInterval: Duration) {
|
|
var lastExecutedAt = Instant.DISTANT_PAST
|
|
private set
|
|
|
|
/**
|
|
* invoke [f] if the last invocation was earlier than now minus [minimalInterval], otherwise
|
|
* do nothing.
|
|
* @return the value returned by [f] if it was actually invoked this time, null otherwise
|
|
*/
|
|
suspend operator fun <T> invoke(f: suspend () -> T): T? =
|
|
if (Clock.System.now() - lastExecutedAt > minimalInterval) {
|
|
f().also { lastExecutedAt = Clock.System.now() }
|
|
} else null
|
|
} |