mirror of
https://github.com/InsanusMokrassar/krontab.git
synced 2024-11-26 12:08:50 +00:00
add base public functions for scheduling
This commit is contained in:
parent
fa68bf72dc
commit
eb0f78a9e4
@ -1,6 +1,7 @@
|
|||||||
package com.github.insanusmokrassar.krontab
|
package com.github.insanusmokrassar.krontab
|
||||||
|
|
||||||
import com.soywiz.klock.DateTime
|
import com.soywiz.klock.DateTime
|
||||||
|
import com.soywiz.klock.DateTimeSpan
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
|
|
||||||
private val anyCronDateTime by lazy {
|
private val anyCronDateTime by lazy {
|
||||||
@ -15,8 +16,39 @@ internal fun CronDateTimeScheduler.next(relatively: DateTime = DateTime.now()):
|
|||||||
return cronDateTimes.map { it.toNearDateTime(relatively) }.min() ?: anyCronDateTime.toNearDateTime(relatively)
|
return cronDateTimes.map { it.toNearDateTime(relatively) }.min() ?: anyCronDateTime.toNearDateTime(relatively)
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun CronDateTimeScheduler.doInLoop(block: () -> Boolean) {
|
internal suspend fun CronDateTimeScheduler.doInLoop(block: suspend () -> Boolean) {
|
||||||
do {
|
do {
|
||||||
delay(next().unixMillisLong - DateTime.now().unixMillisLong)
|
delay(next().unixMillisLong - DateTime.now().unixMillisLong)
|
||||||
} while (block())
|
} while (block())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal fun CronDateTime.toNearDateTime(relativelyTo: DateTime = DateTime.now()): DateTime {
|
||||||
|
var current = relativelyTo
|
||||||
|
|
||||||
|
seconds?.let {
|
||||||
|
val left = it - current.seconds
|
||||||
|
current += DateTimeSpan(minutes = if (left < 0) 1 else 0, seconds = left)
|
||||||
|
}
|
||||||
|
|
||||||
|
minutes?.let {
|
||||||
|
val left = it - current.minutes
|
||||||
|
current += DateTimeSpan(hours = if (left < 0) 1 else 0, minutes = left)
|
||||||
|
}
|
||||||
|
|
||||||
|
hours?.let {
|
||||||
|
val left = it - current.hours
|
||||||
|
current += DateTimeSpan(days = if (left < 0) 1 else 0, hours = left)
|
||||||
|
}
|
||||||
|
|
||||||
|
klockDayOfMonth ?.let {
|
||||||
|
val left = it - current.dayOfMonth
|
||||||
|
current += DateTimeSpan(months = if (left < 0) 1 else 0, days = left)
|
||||||
|
}
|
||||||
|
|
||||||
|
month ?.let {
|
||||||
|
val left = it - current.month0
|
||||||
|
current += DateTimeSpan(months = if (left < 0) 1 else 0, days = left)
|
||||||
|
}
|
||||||
|
|
||||||
|
return current
|
||||||
|
}
|
||||||
|
@ -1,37 +1,16 @@
|
|||||||
package com.github.insanusmokrassar.krontab
|
package com.github.insanusmokrassar.krontab
|
||||||
|
|
||||||
import com.soywiz.klock.DateTime
|
suspend fun doWhile(scheduleConfig: String, block: suspend () -> Boolean) {
|
||||||
import com.soywiz.klock.DateTimeSpan
|
val scheduler = CronDateTimeScheduler(parse(scheduleConfig))
|
||||||
|
|
||||||
|
scheduler.doInLoop(block)
|
||||||
|
|
||||||
fun CronDateTime.toNearDateTime(relativelyTo: DateTime = DateTime.now()): DateTime {
|
|
||||||
var current = relativelyTo
|
|
||||||
|
|
||||||
seconds?.let {
|
|
||||||
val left = it - current.seconds
|
|
||||||
current += DateTimeSpan(minutes = if (left < 0) 1 else 0, seconds = left)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
minutes?.let {
|
suspend fun executeOnce(scheduleConfig: String, block: suspend () -> Boolean) {
|
||||||
val left = it - current.minutes
|
val scheduler = CronDateTimeScheduler(parse(scheduleConfig))
|
||||||
current += DateTimeSpan(hours = if (left < 0) 1 else 0, minutes = left)
|
|
||||||
}
|
|
||||||
|
|
||||||
hours?.let {
|
scheduler.doInLoop {
|
||||||
val left = it - current.hours
|
block()
|
||||||
current += DateTimeSpan(days = if (left < 0) 1 else 0, hours = left)
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
klockDayOfMonth ?.let {
|
|
||||||
val left = it - current.dayOfMonth
|
|
||||||
current += DateTimeSpan(months = if (left < 0) 1 else 0, days = left)
|
|
||||||
}
|
|
||||||
|
|
||||||
month ?.let {
|
|
||||||
val left = it - current.month0
|
|
||||||
current += DateTimeSpan(months = if (left < 0) 1 else 0, days = left)
|
|
||||||
}
|
|
||||||
|
|
||||||
return current
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user