2020-12-05 19:00:57 +00:00
|
|
|
package dev.inmo.krontab.collection
|
|
|
|
|
|
|
|
import com.soywiz.klock.DateTime
|
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
|
|
|
import dev.inmo.krontab.internal.CronDateTimeScheduler
|
|
|
|
import dev.inmo.krontab.internal.toNearDateTime
|
|
|
|
|
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>
|
|
|
|
) : KronScheduler {
|
|
|
|
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
|
|
|
)
|
|
|
|
}
|
|
|
|
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
|
|
|
}
|
|
|
|
}
|