add repeat on failure with callback

This commit is contained in:
InsanusMokrassar 2023-01-22 22:43:26 +06:00
parent ec3afc615c
commit 20799b9a3e

View File

@ -1,5 +1,27 @@
package dev.inmo.micro_utils.common package dev.inmo.micro_utils.common
/**
* Executes the given [action] until getting of successful result specified number of [times].
*
* A zero-based index of current iteration is passed as a parameter to [action].
*/
inline fun <R> repeatOnFailure(
onFailure: (Throwable) -> Boolean,
action: () -> R
): Result<R> {
do {
runCatching {
action()
}.onFailure {
if (!onFailure(it)) {
return Result.failure(it)
}
}.onSuccess {
return Result.success(it)
}
} while (true)
}
/** /**
* Executes the given [action] until getting of successful result specified number of [times]. * Executes the given [action] until getting of successful result specified number of [times].
* *
@ -10,12 +32,23 @@ inline fun <R> repeatOnFailure(
onEachFailure: (Throwable) -> Unit = {}, onEachFailure: (Throwable) -> Unit = {},
action: (Int) -> R action: (Int) -> R
): Optional<R> { ): Optional<R> {
repeat(times) { var i = 0
runCatching { val result = repeatOnFailure(
action(it) {
}.onFailure(onEachFailure).onSuccess { onEachFailure(it)
return Optional.presented(it) if (i < times) {
i++
true
} else {
false
}
} }
) {
action(i)
}
return if (result.isSuccess) {
Optional.presented(result.getOrThrow())
} else {
Optional.absent()
} }
return Optional.absent()
} }