2021-04-09 18:28:08 +00:00
|
|
|
package dev.inmo.krontab.internal
|
|
|
|
|
2023-05-25 14:53:10 +00:00
|
|
|
import korlibs.time.DateTime
|
|
|
|
import korlibs.time.DateTimeTz
|
|
|
|
import korlibs.time.TimezoneOffset
|
2021-04-22 05:58:19 +00:00
|
|
|
import dev.inmo.krontab.KronScheduler
|
|
|
|
import dev.inmo.krontab.KronSchedulerTz
|
2021-04-09 18:28:08 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Cron-oriented realisation of [KronScheduler] with taking into account [offset] for list of [cronDateTimes]
|
|
|
|
*
|
|
|
|
* @see CronDateTime
|
|
|
|
*/
|
|
|
|
internal data class CronDateTimeSchedulerTz internal constructor(
|
2021-05-30 11:15:32 +00:00
|
|
|
internal val cronDateTime: CronDateTime,
|
2021-04-09 18:28:08 +00:00
|
|
|
internal val offset: TimezoneOffset
|
|
|
|
) : KronSchedulerTz {
|
|
|
|
override suspend fun next(relatively: DateTimeTz): DateTimeTz? {
|
2021-04-10 09:29:55 +00:00
|
|
|
val dateTimeWithActualOffset = relatively.toOffset(offset).local
|
2021-05-30 11:15:32 +00:00
|
|
|
return cronDateTime.toNearDateTime(dateTimeWithActualOffset) ?.toOffsetUnadjusted(offset) ?.toOffset(relatively.offset)
|
2021-04-09 18:28:08 +00:00
|
|
|
}
|
2022-12-14 16:44:27 +00:00
|
|
|
|
|
|
|
override suspend fun next(relatively: DateTime): DateTime? {
|
|
|
|
return next(relatively.toOffset(offset)) ?.utc
|
|
|
|
}
|
2021-04-09 18:28:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
internal fun mergeCronDateTimeSchedulers(
|
|
|
|
schedulers: List<CronDateTimeSchedulerTz>
|
|
|
|
) = schedulers.groupBy {
|
|
|
|
it.offset
|
|
|
|
}.map { (offset, schedulers) ->
|
2021-05-30 11:15:32 +00:00
|
|
|
CronDateTimeSchedulerTz(
|
|
|
|
schedulers.map { it.cronDateTime }.merge(),
|
|
|
|
offset
|
|
|
|
)
|
2021-04-09 18:28:08 +00:00
|
|
|
}
|