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

55 lines
2.0 KiB
Kotlin
Raw Normal View History

2020-12-05 19:00:57 +00:00
package dev.inmo.krontab.collection
import com.soywiz.klock.DateTime
import dev.inmo.krontab.KronScheduler
import dev.inmo.krontab.anyCronDateTime
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
2020-12-05 19:40:29 +00:00
import dev.inmo.krontab.internal.merge
2020-12-05 19:00:57 +00:00
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:00:57 +00:00
data class CollectionKronScheduler private constructor(
internal val schedulers: MutableList<KronScheduler>
) : KronScheduler {
internal constructor(schedulers: List<KronScheduler>) : this(schedulers.toMutableList())
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 [merge] function
* * 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(
2020-12-05 19:40:29 +00:00
merge(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 {
return schedulers.minOfOrNull { it.next(relatively) } ?: anyCronDateTime.toNearDateTime(relatively)
}
}