krontab/src/commonMain/kotlin/dev/inmo/krontab/collection/CollectionKronScheduler.kt

67 lines
2.6 KiB
Kotlin
Raw Normal View History

2020-12-05 19:00:57 +00:00
package dev.inmo.krontab.collection
import korlibs.time.DateTime
import korlibs.time.DateTimeTz
import dev.inmo.krontab.*
2020-12-05 19:40:29 +00:00
import dev.inmo.krontab.internal.*
2020-12-05 19:00:57 +00:00
2020-12-05 19:40:29 +00:00
/**
* This scheduler will be useful in case you want to unite several different [KronScheduler]s
*/
2020-12-05 19:48:00 +00:00
data class CollectionKronScheduler internal constructor(
2020-12-05 19:00:57 +00:00
internal val schedulers: MutableList<KronScheduler>
2021-04-09 18:28:08 +00:00
) : KronSchedulerTz {
2020-12-05 19:00:57 +00:00
internal constructor() : this(mutableListOf())
2020-12-05 19:40:29 +00:00
/**
* Add [kronScheduler] into its [schedulers] list
*
* * When [kronScheduler] is [CronDateTimeScheduler] it will merge all [CronDateTimeScheduler]s from [schedulers] list
* and this [kronScheduler] using [mergeCronDateTimeSchedulers] function
2020-12-05 19:40:29 +00:00
* * When [kronScheduler] is [CollectionKronScheduler] it this instance will include all [kronScheduler]
* [schedulers]
* * Otherwise [kronScheduler] will be added to [schedulers] list
*/
2020-12-05 19:00:57 +00:00
fun include(kronScheduler: KronScheduler) {
when (kronScheduler) {
is CronDateTimeScheduler -> {
2020-12-05 19:40:29 +00:00
val resultCronDateTimes = mutableListOf(kronScheduler)
2020-12-05 19:00:57 +00:00
schedulers.removeAll {
if (it is CronDateTimeScheduler) {
2020-12-05 19:40:29 +00:00
resultCronDateTimes.add(it)
2020-12-05 19:00:57 +00:00
} else {
false
}
}
schedulers.add(
mergeCronDateTimeSchedulers(resultCronDateTimes)
2020-12-05 19:00:57 +00:00
)
}
is CronDateTimeSchedulerTz -> {
val newCronDateTimes = mutableListOf(kronScheduler.cronDateTime)
schedulers.removeAll {
if (it is CronDateTimeSchedulerTz && it.offset == kronScheduler.offset) {
newCronDateTimes.add(it.cronDateTime)
true
} else {
false
}
}
schedulers.add(CronDateTimeSchedulerTz(newCronDateTimes.merge(), kronScheduler.offset))
}
2020-12-05 19:00:57 +00:00
is CollectionKronScheduler -> kronScheduler.schedulers.forEach {
include(it)
}
else -> schedulers.add(kronScheduler)
}
}
override suspend fun next(relatively: DateTime): DateTime {
return schedulers.mapNotNull { it.next(relatively) }.minOrNull() ?: getAnyNext(relatively)
2020-12-05 19:00:57 +00:00
}
2021-03-30 08:07:39 +00:00
override suspend fun next(relatively: DateTimeTz): DateTimeTz {
2021-04-09 18:28:08 +00:00
return schedulers.mapNotNull { it.next(relatively) }.minOrNull() ?: getAnyNext(relatively.local).toOffsetUnadjusted(relatively.offset)
2021-03-30 08:07:39 +00:00
}
2020-12-05 19:00:57 +00:00
}