add last and first

This commit is contained in:
InsanusMokrassar 2020-10-10 21:12:32 +06:00
parent 6d612ce95d
commit 5a13437c17
5 changed files with 47 additions and 6 deletions

View File

@ -11,6 +11,13 @@
### 0.3.2 ### 0.3.2
* Add opportunity to use `first` shortcuts:
* Value property `TimeBuilder#first` for including via functions like `TimeBuilder#at`
* Shortcut for kron string format `f` or `F`
* Add opportunity to use `last` shortcuts:
* Value property `TimeBuilder#last` for including via functions like `TimeBuilder#at`
* Shortcut for kron string format `l` or `L`
### 0.3.1 ### 0.3.1
* Versions: * Versions:

View File

@ -27,6 +27,8 @@ typealias KrontabTemplate = String
* * {int}/{int} * * {int}/{int}
* * */{int} * * */{int}
* * {int} * * {int}
* * F
* * L
* *
* Additional info about ranges can be found in follow accordance: * Additional info about ranges can be found in follow accordance:
* *
@ -39,8 +41,9 @@ typealias KrontabTemplate = String
* Examples: * Examples:
* *
* * "0/5 * * * *" for every five seconds triggering * * "0/5 * * * *" for every five seconds triggering
* * "0/5,L * * * *" for every five seconds triggering and on 59 second
* * "0/15 30 * * *" for every 15th seconds in a half of each hour * * "0/15 30 * * *" for every 15th seconds in a half of each hour
* * "1 2 3 4 5" for triggering in near first second of second minute of third hour of fourth day of may * * "1 2 3 F,4,L 5" for triggering in near first second of second minute of third hour of fourth day of may
* *
* @see com.insanusmokrassar.krontab.internal.createKronScheduler * @see com.insanusmokrassar.krontab.internal.createKronScheduler
*/ */

View File

@ -12,6 +12,17 @@ sealed class TimeBuilder (
) { ) {
private var result: Set<Int>? = null private var result: Set<Int>? = null
/**
* The first possible value of builder
*/
val first
get() = restrictionsRange.first
/**
* The last possible value of builder. Using of this variable equal to using "L" in strings
*/
val last
get() = restrictionsRange.last
/** /**
* After calling of this function this builder will allow any value of current time * After calling of this function this builder will allow any value of current time
*/ */
@ -92,6 +103,15 @@ sealed class TimeBuilder (
@Suppress("MemberVisibilityCanBePrivate") @Suppress("MemberVisibilityCanBePrivate")
infix operator fun rangeTo(endIncluding: Int) = (this from 0) rangeTo endIncluding infix operator fun rangeTo(endIncluding: Int) = (this from 0) rangeTo endIncluding
/**
* Will include the last possible value
*/
fun includeLast() = at(restrictionsRange.last)
/**
* Will include the first possible value
*/
fun includeFirst() = at(restrictionsRange.first)
internal fun build() = result ?.map { it.toByte() } ?.toTypedArray() internal fun build() = result ?.map { it.toByte() } ?.toTypedArray()
} }

View File

@ -52,7 +52,13 @@ internal fun CronDateTime.toNearDateTime(relativelyTo: DateTime = DateTime.now()
} }
klockDayOfMonth ?.let { klockDayOfMonth ?.let {
val left = it - current.dayOfMonth val left = (it - current.dayOfMonth).let { diff ->
if (diff > 0 && current.endOfMonth.run { it > dayOfMonth && current.dayOfMonth == dayOfMonth }) {
0
} else {
diff
}
}
current += DateTimeSpan(months = if (left < 0) 1 else 0, days = left) current += DateTimeSpan(months = if (left < 0) 1 else 0, days = left)
} }

View File

@ -6,13 +6,18 @@ private fun createSimpleScheduler(from: String, dataRange: IntRange): Array<Byte
val things = from.split(",") val things = from.split(",")
val results = things.flatMap { val results = things.flatMap {
val currentToken = it.toLowerCase().replace(
"f", dataRange.first.toString()
).replace(
"l", dataRange.last.toString()
)
when { when {
it.contains("-") -> { currentToken.contains("-") -> {
val splitted = it.split("-") val splitted = currentToken.split("-")
(splitted.first().toInt().clamp(dataRange) .. splitted[1].toInt().clamp(dataRange)).toList() (splitted.first().toInt().clamp(dataRange) .. splitted[1].toInt().clamp(dataRange)).toList()
} }
it.contains("/") -> { currentToken.contains("/") -> {
val (start, step) = it.split("/") val (start, step) = currentToken.split("/")
val startNum = (if (start.isEmpty() || start == "*") { val startNum = (if (start.isEmpty() || start == "*") {
0 0
} else { } else {