
commonMain.kotlinw.util.coroutine.FunctionUtils.kt Maven / Gradle / Ivy
package kotlinw.util.coroutine
import com.github.michaelbull.result.Result
import com.github.michaelbull.result.onFailure
import com.github.michaelbull.result.onSuccess
import com.github.michaelbull.result.runCatching
import kotlinx.coroutines.currentCoroutineContext
import kotlinx.coroutines.delay
import kotlinx.coroutines.ensureActive
import kotlin.time.Duration
suspend inline fun retryUntilSuccessful(
delayAfterFailure: Duration = Duration.ZERO,
noinline onFailure: (E) -> Unit = {},
block: () -> Result
): V {
while (true) {
block()
.onSuccess { return it }
.onFailure(onFailure)
currentCoroutineContext().ensureActive()
delay(delayAfterFailure)
}
}
suspend inline fun retryUntilNoExceptionThrown(
delayAfterException: Duration = Duration.ZERO,
noinline onException: (Throwable) -> Unit = {},
block: () -> V
): V =
retryUntilSuccessful(delayAfterException, onException) {
runCatching { block() }
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy