From c9243d79681126bec8a7c6c9f609f17985b8e799 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Wed, 3 Jun 2020 21:53:55 +0600 Subject: [PATCH] optimization and docs of executes --- .../com/insanusmokrassar/krontab/Executes.kt | 47 ++++++++++++++----- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/src/commonMain/kotlin/com/insanusmokrassar/krontab/Executes.kt b/src/commonMain/kotlin/com/insanusmokrassar/krontab/Executes.kt index fdd5c13..55acf5b 100644 --- a/src/commonMain/kotlin/com/insanusmokrassar/krontab/Executes.kt +++ b/src/commonMain/kotlin/com/insanusmokrassar/krontab/Executes.kt @@ -1,32 +1,53 @@ package com.insanusmokrassar.krontab import com.soywiz.klock.DateTime +import kotlinx.coroutines.Deferred import kotlinx.coroutines.delay -suspend inline fun KronScheduler.doWhile(noinline block: suspend () -> Boolean) { - do { - delay((next() - DateTime.now()).millisecondsLong) - } while (block()) +/** + * Execute [block] once at the [KronScheduler.next] time and return result of [block] calculation. + * + * WARNING!!! If you want to launch it in parallel, you must do this explicit. + */ +suspend inline fun KronScheduler.doOnce(noinline block: suspend () -> T): T { + delay((next() - DateTime.now()).millisecondsLong) + return block() } + +/** + * Will [createSimpleScheduler] using [scheduleConfig] and call [doOnce] on it + */ +suspend inline fun doOnce( + scheduleConfig: String, + noinline block: suspend () -> T +) = createSimpleScheduler(scheduleConfig).doOnce(block) + +/** + * Will execute [block] while it will return true as a result of its calculation + */ +suspend inline fun KronScheduler.doWhile(noinline block: suspend () -> Boolean) { + do { val doNext = doOnce(block) } while (doNext) +} + +/** + * Will [createSimpleScheduler] using [scheduleConfig] and call [doWhile] with [block] + */ suspend inline fun doWhile( scheduleConfig: String, noinline block: suspend () -> Boolean ) = createSimpleScheduler(scheduleConfig).doWhile(block) +/** + * Will execute [block] without any checking of result + */ suspend inline fun KronScheduler.doInfinity(noinline block: suspend () -> Unit) = doWhile { block() true } +/** + * Will [createSimpleScheduler] using [scheduleConfig] and call [doInfinity] with [block] + */ suspend inline fun doInfinity( scheduleConfig: String, noinline block: suspend () -> Unit ) = createSimpleScheduler(scheduleConfig).doInfinity(block) - -suspend inline fun KronScheduler.doOnce(noinline block: suspend () -> Unit) = doWhile { - block() - false -} -suspend inline fun doOnce( - scheduleConfig: String, - noinline block: suspend () -> Unit -) = createSimpleScheduler(scheduleConfig).doOnce(block)