diff --git a/CHANGELOG.md b/CHANGELOG.md index f73fe21..fda6290 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## 2.3.0 +* `doWhile` now will guarantee that it will not call `doOnce` more than once for time + ## 2.2.9 * `Version`: diff --git a/src/commonMain/kotlin/Executes.kt b/src/commonMain/kotlin/Executes.kt index 35356b3..90a31ba 100644 --- a/src/commonMain/kotlin/Executes.kt +++ b/src/commonMain/kotlin/Executes.kt @@ -71,9 +71,18 @@ suspend inline fun doOnceTz( * Will execute [block] while it will return true as a result of its calculation */ suspend inline fun KronScheduler.doWhile(block: (DateTime) -> Boolean) { + var latest: DateTime? = null do { delay(1L) - } while (doOnce(block)) + val result = doOnce { + if (latest != it) { + latest = it + block(it) + } else { + null + } + } + } while (result == null || result) } /** * Will execute [block] while it will return true as a result of its calculation @@ -85,9 +94,18 @@ suspend inline fun KronScheduler.doWhileLocal(block: (DateTime) -> Boolean) = do * Will execute [block] while it will return true as a result of its calculation */ suspend inline fun KronScheduler.doWhileTz(noinline block: suspend (DateTimeTz) -> Boolean) { + var latest: DateTimeTz? = null do { delay(1L) - } while (doOnceTz(block)) + val result = doOnceTz { + if (latest != it) { + latest = it + block(it) + } else { + null + } + } + } while (result == null || result) } /**