mirror of
https://github.com/InsanusMokrassar/krontab.git
synced 2025-12-19 19:36:04 +00:00
files replacements
This commit is contained in:
23
src/commonMain/kotlin/utils/DateTimeCopy.kt
Normal file
23
src/commonMain/kotlin/utils/DateTimeCopy.kt
Normal file
@@ -0,0 +1,23 @@
|
||||
package dev.inmo.krontab.utils
|
||||
|
||||
import korlibs.time.DateTime
|
||||
import korlibs.time.Month
|
||||
import kotlin.math.min
|
||||
|
||||
fun DateTime.copy(
|
||||
year: Int = yearInt,
|
||||
month: Int = month1,
|
||||
dayOfMonth: Int = this.dayOfMonth,
|
||||
hour: Int = hours,
|
||||
minute: Int = minutes,
|
||||
second: Int = seconds,
|
||||
milliseconds: Int = this.milliseconds
|
||||
) = DateTime(
|
||||
year,
|
||||
month,
|
||||
min(Month(month).days(yearInt), dayOfMonth),
|
||||
hour,
|
||||
minute,
|
||||
second,
|
||||
milliseconds
|
||||
)
|
||||
93
src/commonMain/kotlin/utils/SchedulerFlow.kt
Normal file
93
src/commonMain/kotlin/utils/SchedulerFlow.kt
Normal file
@@ -0,0 +1,93 @@
|
||||
package dev.inmo.krontab.utils
|
||||
|
||||
import korlibs.time.DateTime
|
||||
import korlibs.time.DateTimeTz
|
||||
import korlibs.time.milliseconds
|
||||
import dev.inmo.krontab.KronScheduler
|
||||
import dev.inmo.krontab.next
|
||||
import kotlinx.coroutines.currentCoroutineContext
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.flow
|
||||
import kotlinx.coroutines.flow.onEach
|
||||
import kotlinx.coroutines.isActive
|
||||
|
||||
/**
|
||||
* **This flow is [cold](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/)**
|
||||
*
|
||||
* Will emit all the [KronScheduler.next] as soon as possible. In case [KronScheduler.next] return null, flow will
|
||||
* be completed
|
||||
*
|
||||
* @param since Will be used as the first parameter for [KronScheduler.next] fun. If passed null, `flow`
|
||||
* will always start since the moment of collecting start
|
||||
*/
|
||||
fun KronScheduler.asTzFlowWithoutDelays(since: DateTimeTz? = null): Flow<DateTimeTz> = flow {
|
||||
var previous = since ?: DateTime.nowLocal()
|
||||
while (currentCoroutineContext().isActive) {
|
||||
val next = next(previous) ?: break
|
||||
emit(next)
|
||||
previous = next + 1.milliseconds
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* **This flow is [cold](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/)**
|
||||
*
|
||||
* This [Flow] will use [asTzFlowWithoutDelays], but stop on each time until this time will happen
|
||||
*/
|
||||
fun KronScheduler.asTzFlowWithDelays(): Flow<DateTimeTz> = asTzFlowWithoutDelays().onEach { futureHappenTime ->
|
||||
val now = DateTime.nowLocal()
|
||||
|
||||
delay((futureHappenTime - now).millisecondsLong)
|
||||
}
|
||||
|
||||
/**
|
||||
* **This flow is [cold](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/)**
|
||||
*
|
||||
* This [Flow] will use [asTzFlowWithoutDelays], but stop on each time until this time will happen
|
||||
*/
|
||||
@Deprecated(
|
||||
"Behaviour will be changed. In some of near versions this flow will not delay executions",
|
||||
ReplaceWith("this.asTzFlowWithDelays()", "dev.inmo.krontab.utils.asTzFlowWithDelays")
|
||||
)
|
||||
fun KronScheduler.asTzFlow(): Flow<DateTimeTz> = asTzFlowWithDelays()
|
||||
|
||||
/**
|
||||
* **This flow is [cold](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/)**
|
||||
*
|
||||
* Will emit all the [KronScheduler.next] as soon as possible. In case [KronScheduler.next] return null, flow will
|
||||
* be completed
|
||||
*
|
||||
* @param since Will be used as the first parameter for [KronScheduler.next] fun. If passed null, `flow`
|
||||
* will always start since the moment of collecting start
|
||||
*/
|
||||
fun KronScheduler.asFlowWithoutDelays(since: DateTime? = null): Flow<DateTime> = flow {
|
||||
var previous = since ?: DateTime.now()
|
||||
while (currentCoroutineContext().isActive) {
|
||||
val next = next(previous) ?: break
|
||||
emit(next)
|
||||
previous = next + 1.milliseconds
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* **This flow is [cold](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/)**
|
||||
*
|
||||
* This [Flow] will use [asFlowWithoutDelays], but stop on each time until this time will happen
|
||||
*/
|
||||
fun KronScheduler.asFlowWithDelays(): Flow<DateTime> = asFlowWithoutDelays().onEach { futureHappenTime ->
|
||||
val now = DateTime.now()
|
||||
|
||||
delay((futureHappenTime - now).millisecondsLong)
|
||||
}
|
||||
|
||||
/**
|
||||
* **This flow is [cold](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/)**
|
||||
*
|
||||
* This [Flow] will use [asFlowWithDelays], but stop on each time until this time will happen
|
||||
*/
|
||||
@Deprecated(
|
||||
"Behaviour will be changed. In some of near versions this flow will not delay executions",
|
||||
ReplaceWith("this.asFlowWithDelays()", "dev.inmo.krontab.utils.asFlowWithDelays")
|
||||
)
|
||||
fun KronScheduler.asFlow(): Flow<DateTime> = asFlowWithDelays()
|
||||
3
src/commonMain/kotlin/utils/Typealiases.kt
Normal file
3
src/commonMain/kotlin/utils/Typealiases.kt
Normal file
@@ -0,0 +1,3 @@
|
||||
package dev.inmo.krontab.utils
|
||||
|
||||
typealias Minutes = Int
|
||||
34
src/commonMain/kotlin/utils/flows/DateTimeFilters.kt
Normal file
34
src/commonMain/kotlin/utils/flows/DateTimeFilters.kt
Normal file
@@ -0,0 +1,34 @@
|
||||
package dev.inmo.krontab.utils.flows
|
||||
|
||||
import korlibs.time.*
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.filter
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTime>.filterSeconds(vararg seconds: Int) = filter { it.seconds in seconds }
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTime>.filterMinutes(vararg minutes: Int) = filter { it.minutes in minutes }
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTime>.filterHours(vararg hours: Int) = filter { it.hours in hours }
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTime>.filterDaysOfMonths(vararg daysOfMonths: Int) = filter { it.dayOfMonth in daysOfMonths }
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTime>.filterMonths(vararg months: Month) = filter { it.month in months }
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTime>.filterMonths0(vararg months: Int) = filter { it.month0 in months }
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTime>.filterMonths1(vararg months: Int) = filter { it.month1 in months }
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTime>.filterYears(year: Year) = filter { it.year == year }
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTime>.filterYears(vararg years: Int) = filter { it.yearInt in years }
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTime>.filterWeekDays(vararg weekDays: DayOfWeek) = filter { it.dayOfWeek in weekDays }
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTime>.filterWeekDays(vararg weekDays: Int) = filter { it.dayOfWeekInt in weekDays }
|
||||
34
src/commonMain/kotlin/utils/flows/DateTimeTzFilters.kt
Normal file
34
src/commonMain/kotlin/utils/flows/DateTimeTzFilters.kt
Normal file
@@ -0,0 +1,34 @@
|
||||
package dev.inmo.krontab.utils.flows
|
||||
|
||||
import korlibs.time.*
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.filter
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTimeTz>.filterSeconds(vararg seconds: Int) = filter { it.seconds in seconds }
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTimeTz>.filterMinutes(vararg minutes: Int) = filter { it.minutes in minutes }
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTimeTz>.filterHours(vararg hours: Int) = filter { it.hours in hours }
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTimeTz>.filterDaysOfMonths(vararg daysOfMonths: Int) = filter { it.dayOfMonth in daysOfMonths }
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTimeTz>.filterMonths(vararg months: Month) = filter { it.month in months }
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTimeTz>.filterMonths0(vararg months: Int) = filter { it.month0 in months }
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTimeTz>.filterMonths1(vararg months: Int) = filter { it.month1 in months }
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTimeTz>.filterYears(year: Year) = filter { it.year == year }
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTimeTz>.filterYears(vararg years: Int) = filter { it.yearInt in years }
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTimeTz>.filterWeekDays(vararg weekDays: DayOfWeek) = filter { it.dayOfWeek in weekDays }
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTimeTz>.filterWeekDays(vararg weekDays: Int) = filter { it.dayOfWeekInt in weekDays }
|
||||
25
src/commonMain/kotlin/utils/flows/DateTimeTzWhen.kt
Normal file
25
src/commonMain/kotlin/utils/flows/DateTimeTzWhen.kt
Normal file
@@ -0,0 +1,25 @@
|
||||
package dev.inmo.krontab.utils.flows
|
||||
|
||||
import korlibs.time.*
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTime>.onlyStartsOfMinutes() = filterSeconds(0)
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTime>.onlyStartsOfHours() = filterMinutes(0).onlyStartsOfMinutes()
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTime>.onlyStartsOfDays() = filterHours(0).onlyStartsOfHours()
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTime>.onlyStartsOfMondays() = filterWeekDays(DayOfWeek.Monday).onlyStartsOfDays()
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTime>.onlyStartsOfSundays() = filterWeekDays(DayOfWeek.Sunday).onlyStartsOfDays()
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTime>.onlyStartsOfMonths() = filterDaysOfMonths(1).onlyStartsOfDays()
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTime>.onlyStartsOfYears() = filterMonths(Month.January).onlyStartsOfMonths()
|
||||
25
src/commonMain/kotlin/utils/flows/DateTimeWhen.kt
Normal file
25
src/commonMain/kotlin/utils/flows/DateTimeWhen.kt
Normal file
@@ -0,0 +1,25 @@
|
||||
package dev.inmo.krontab.utils.flows
|
||||
|
||||
import korlibs.time.*
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTimeTz>.onlyStartsOfMinutes() = filterSeconds(0)
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTimeTz>.onlyStartsOfHours() = filterMinutes(0).onlyStartsOfMinutes()
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTimeTz>.onlyStartsOfDays() = filterHours(0).onlyStartsOfHours()
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTimeTz>.onlyStartsOfMondays() = filterWeekDays(DayOfWeek.Monday).onlyStartsOfDays()
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTimeTz>.onlyStartsOfSundays() = filterWeekDays(DayOfWeek.Sunday).onlyStartsOfDays()
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTimeTz>.onlyStartsOfMonths() = filterDaysOfMonths(1).onlyStartsOfDays()
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Flow<DateTimeTz>.onlyStartsOfYears() = filterMonths(Month.January).onlyStartsOfMonths()
|
||||
Reference in New Issue
Block a user