fixes and small publish of API

This commit is contained in:
InsanusMokrassar 2019-10-05 16:29:59 +06:00
parent 6cfb190aa8
commit 328ffd87ca
5 changed files with 56 additions and 50 deletions

View File

@ -4,6 +4,8 @@ import com.github.insanusmokrassar.krontab.utils.*
import com.github.insanusmokrassar.krontab.utils.clamp import com.github.insanusmokrassar.krontab.utils.clamp
import com.github.insanusmokrassar.krontab.utils.dayOfMonthRange import com.github.insanusmokrassar.krontab.utils.dayOfMonthRange
import com.github.insanusmokrassar.krontab.utils.monthRange import com.github.insanusmokrassar.krontab.utils.monthRange
import com.soywiz.klock.DateTime
import com.soywiz.klock.DateTimeSpan
/** /**
* [month] 0-11 * [month] 0-11
@ -45,3 +47,34 @@ internal data class CronDateTime(
) )
} }
} }
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
}

View File

@ -8,47 +8,16 @@ private val anyCronDateTime by lazy {
CronDateTime() CronDateTime()
} }
internal data class CronDateTimeScheduler( data class CronDateTimeScheduler internal constructor(
internal val cronDateTimes: List<CronDateTime> internal val cronDateTimes: List<CronDateTime>
) )
internal fun CronDateTimeScheduler.next(relatively: DateTime = DateTime.now()): DateTime { fun CronDateTimeScheduler.next(relatively: DateTime = DateTime.now()): DateTime {
return cronDateTimes.map { it.toNearDateTime(relatively) }.min() ?: anyCronDateTime.toNearDateTime(relatively) return cronDateTimes.map { it.toNearDateTime(relatively) }.min() ?: anyCronDateTime.toNearDateTime(relatively)
} }
internal suspend fun CronDateTimeScheduler.doInLoop(block: suspend () -> Boolean) { 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
}

View File

@ -5,7 +5,7 @@ import com.github.insanusmokrassar.krontab.utils.clamp
import com.github.insanusmokrassar.krontab.utils.minutesRange import com.github.insanusmokrassar.krontab.utils.minutesRange
import com.github.insanusmokrassar.krontab.utils.secondsRange import com.github.insanusmokrassar.krontab.utils.secondsRange
private fun parse(from: String, dataRange: IntRange): Array<Byte>? { private fun createCronDateTimeScheduler(from: String, dataRange: IntRange): Array<Byte>? {
val things = from.split(",") val things = from.split(",")
val results = things.flatMap { val results = things.flatMap {
@ -28,11 +28,11 @@ private fun parse(from: String, dataRange: IntRange): Array<Byte>? {
return results.map { it.toByte() }.toTypedArray() return results.map { it.toByte() }.toTypedArray()
} }
private fun parseMonths(from: String) = parse(from, monthRange) private fun parseMonths(from: String) = createCronDateTimeScheduler(from, monthRange)
private fun parseDaysOfMonth(from: String) = parse(from, dayOfMonthRange) private fun parseDaysOfMonth(from: String) = createCronDateTimeScheduler(from, dayOfMonthRange)
private fun parseHours(from: String) = parse(from, hoursRange) private fun parseHours(from: String) = createCronDateTimeScheduler(from, hoursRange)
private fun parseMinutes(from: String) = parse(from, minutesRange) private fun parseMinutes(from: String) = createCronDateTimeScheduler(from, minutesRange)
private fun parseSeconds(from: String) = parse(from, secondsRange) private fun parseSeconds(from: String) = createCronDateTimeScheduler(from, secondsRange)
private fun Array<Byte>.fillWith( private fun Array<Byte>.fillWith(
whereToPut: MutableList<CronDateTime>, whereToPut: MutableList<CronDateTime>,
@ -49,14 +49,14 @@ private fun Array<Byte>.fillWith(
} }
} }
internal fun parse(incoming: String): List<CronDateTime> { fun createCronDateTimeScheduler(incoming: String): CronDateTimeScheduler {
val (secondsSource, minutesSource, hoursSource, dayOfMonthSource, monthSource) = incoming.split(" ") val (secondsSource, minutesSource, hoursSource, dayOfMonthSource, monthSource) = incoming.split(" ")
val secondsParsed = parseSeconds(secondsSource) val secondsParsed = parseSeconds(secondsSource)
val minutesParsed = parseSeconds(minutesSource) val minutesParsed = parseMinutes(minutesSource)
val hoursParsed = parseSeconds(hoursSource) val hoursParsed = parseHours(hoursSource)
val dayOfMonthParsed = parseSeconds(dayOfMonthSource) val dayOfMonthParsed = parseDaysOfMonth(dayOfMonthSource)
val monthParsed = parseSeconds(monthSource) val monthParsed = parseMonths(monthSource)
val resultCronDateTimes = mutableListOf(CronDateTime()) val resultCronDateTimes = mutableListOf(CronDateTime())
@ -80,5 +80,5 @@ internal fun parse(incoming: String): List<CronDateTime> {
previousCronDateTime.copy(month = currentTime) previousCronDateTime.copy(month = currentTime)
} }
return resultCronDateTimes.toList() return CronDateTimeScheduler(resultCronDateTimes.toList())
} }

View File

@ -1,7 +1,12 @@
package com.github.insanusmokrassar.krontab package com.github.insanusmokrassar.krontab
suspend inline fun executeWith(
scheduler: CronDateTimeScheduler,
noinline block: suspend () -> Boolean
) = scheduler.doInLoop(block)
suspend fun executeInfinity(scheduleConfig: String, block: suspend () -> Unit) { suspend fun executeInfinity(scheduleConfig: String, block: suspend () -> Unit) {
val scheduler = CronDateTimeScheduler(parse(scheduleConfig)) val scheduler = createCronDateTimeScheduler(scheduleConfig)
scheduler.doInLoop { scheduler.doInLoop {
block() block()
@ -10,13 +15,13 @@ suspend fun executeInfinity(scheduleConfig: String, block: suspend () -> Unit) {
} }
suspend fun executeWhile(scheduleConfig: String, block: suspend () -> Boolean) { suspend fun executeWhile(scheduleConfig: String, block: suspend () -> Boolean) {
val scheduler = CronDateTimeScheduler(parse(scheduleConfig)) val scheduler = createCronDateTimeScheduler(scheduleConfig)
scheduler.doInLoop(block) scheduler.doInLoop(block)
} }
suspend fun executeOnce(scheduleConfig: String, block: suspend () -> Unit) { suspend fun executeOnce(scheduleConfig: String, block: suspend () -> Unit) {
val scheduler = CronDateTimeScheduler(parse(scheduleConfig)) val scheduler = createCronDateTimeScheduler(scheduleConfig)
scheduler.doInLoop { scheduler.doInLoop {
block() block()

View File

@ -8,7 +8,6 @@ fun main() {
var i = 0 var i = 0
executeInfinity("/10 /25 * * *") { executeInfinity("/10 /25 * * *") {
println(DateTime.now()) println(DateTime.now())
i++
} }
} }
} }