package com.insanusmokrassar.krontab import com.insanusmokrassar.krontab.internal.* import com.insanusmokrassar.krontab.internal.CronDateTime import com.insanusmokrassar.krontab.internal.parseDaysOfMonth import com.insanusmokrassar.krontab.internal.parseHours import com.insanusmokrassar.krontab.internal.parseMinutes import com.insanusmokrassar.krontab.internal.parseMonths import com.insanusmokrassar.krontab.internal.parseSeconds import com.insanusmokrassar.krontab.internal.toNearDateTime import com.soywiz.klock.DateTime import kotlinx.coroutines.delay data class CronDateTimeScheduler internal constructor( internal val cronDateTimes: List ) fun CronDateTimeScheduler.next(relatively: DateTime = DateTime.now()): DateTime { return cronDateTimes.map { it.toNearDateTime(relatively) }.min() ?: anyCronDateTime.toNearDateTime(relatively) } suspend fun CronDateTimeScheduler.doInLoop(block: suspend () -> Boolean) { do { delay(next().unixMillisLong - DateTime.now().unixMillisLong) } while (block()) } fun createCronDateTimeScheduler(incoming: String): CronDateTimeScheduler { val (secondsSource, minutesSource, hoursSource, dayOfMonthSource, monthSource) = incoming.split(" ") val secondsParsed = parseSeconds(secondsSource) val minutesParsed = parseMinutes(minutesSource) val hoursParsed = parseHours(hoursSource) val dayOfMonthParsed = parseDaysOfMonth(dayOfMonthSource) val monthParsed = parseMonths(monthSource) val resultCronDateTimes = mutableListOf(CronDateTime()) secondsParsed ?.fillWith(resultCronDateTimes) { previousCronDateTime: CronDateTime, currentTime: Byte -> previousCronDateTime.copy(seconds = currentTime) } minutesParsed ?.fillWith(resultCronDateTimes) { previousCronDateTime: CronDateTime, currentTime: Byte -> previousCronDateTime.copy(minutes = currentTime) } hoursParsed ?.fillWith(resultCronDateTimes) { previousCronDateTime: CronDateTime, currentTime: Byte -> previousCronDateTime.copy(hours = currentTime) } dayOfMonthParsed ?.fillWith(resultCronDateTimes) { previousCronDateTime: CronDateTime, currentTime: Byte -> previousCronDateTime.copy(dayOfMonth = currentTime) } monthParsed ?.fillWith(resultCronDateTimes) { previousCronDateTime: CronDateTime, currentTime: Byte -> previousCronDateTime.copy(month = currentTime) } return CronDateTimeScheduler(resultCronDateTimes.toList()) }