krontab/src/commonMain/kotlin/dev/inmo/krontab/internal/CronDateTimeSchedulerTz.kt

38 lines
1.2 KiB
Kotlin
Raw Normal View History

2021-04-09 18:28:08 +00:00
package dev.inmo.krontab.internal
2022-12-14 16:44:27 +00:00
import com.soywiz.klock.DateTime
2021-04-22 05:58:19 +00:00
import com.soywiz.klock.DateTimeTz
import com.soywiz.klock.TimezoneOffset
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(
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
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) ->
CronDateTimeSchedulerTz(
schedulers.map { it.cronDateTime }.merge(),
offset
)
2021-04-09 18:28:08 +00:00
}