2020-12-05 19:00:57 +00:00
|
|
|
package dev.inmo.krontab.collection
|
|
|
|
|
2023-05-25 14:53:10 +00:00
|
|
|
import korlibs.time.DateTime
|
|
|
|
import korlibs.time.DateTimeTz
|
2021-01-02 15:35:08 +00:00
|
|
|
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
|
2021-01-02 14:13:47 +00:00
|
|
|
* 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(
|
2021-01-02 14:13:47 +00:00
|
|
|
mergeCronDateTimeSchedulers(resultCronDateTimes)
|
2020-12-05 19:00:57 +00:00
|
|
|
)
|
|
|
|
}
|
2021-04-09 18:33:05 +00:00
|
|
|
is CronDateTimeSchedulerTz -> {
|
2021-05-30 11:15:32 +00:00
|
|
|
val newCronDateTimes = mutableListOf(kronScheduler.cronDateTime)
|
|
|
|
schedulers.removeAll {
|
2021-04-09 18:33:05 +00:00
|
|
|
if (it is CronDateTimeSchedulerTz && it.offset == kronScheduler.offset) {
|
2021-05-30 11:15:32 +00:00
|
|
|
newCronDateTimes.add(it.cronDateTime)
|
2021-04-09 18:33:05 +00:00
|
|
|
true
|
|
|
|
} else {
|
|
|
|
false
|
|
|
|
}
|
|
|
|
}
|
2021-05-30 11:15:32 +00:00
|
|
|
schedulers.add(CronDateTimeSchedulerTz(newCronDateTimes.merge(), kronScheduler.offset))
|
2021-04-09 18:33:05 +00:00
|
|
|
}
|
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 {
|
2021-01-02 15:35:08 +00:00
|
|
|
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
|
|
|
}
|