Skip to content

Commit d15ec21

Browse files
PeterAttardodkhalanskyjb
authored andcommitted
Implement local date ranges (#189)
Fixes #190
1 parent ba7299a commit d15ec21

File tree

9 files changed

+878
-1
lines changed

9 files changed

+878
-1
lines changed

core/api/kotlinx-datetime.api

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,8 @@ public final class kotlinx/datetime/LocalDate : java/io/Serializable, java/lang/
290290
public final fun getMonthNumber ()I
291291
public final fun getYear ()I
292292
public fun hashCode ()I
293+
public final fun rangeTo (Lkotlinx/datetime/LocalDate;)Lkotlinx/datetime/LocalDateRange;
294+
public final fun rangeUntil (Lkotlinx/datetime/LocalDate;)Lkotlinx/datetime/LocalDateRange;
293295
public final fun toEpochDays ()I
294296
public final fun toEpochDays ()J
295297
public fun toString ()Ljava/lang/String;
@@ -342,6 +344,69 @@ public final class kotlinx/datetime/LocalDateKt {
342344
public static final fun toLocalDate (Ljava/lang/String;)Lkotlinx/datetime/LocalDate;
343345
}
344346

347+
public class kotlinx/datetime/LocalDateProgression : java/util/Collection, kotlin/jvm/internal/markers/KMappedMarker {
348+
public static final field Companion Lkotlinx/datetime/LocalDateProgression$Companion;
349+
public synthetic fun add (Ljava/lang/Object;)Z
350+
public fun add (Lkotlinx/datetime/LocalDate;)Z
351+
public fun addAll (Ljava/util/Collection;)Z
352+
public fun clear ()V
353+
public final fun contains (Ljava/lang/Object;)Z
354+
public fun contains (Lkotlinx/datetime/LocalDate;)Z
355+
public fun containsAll (Ljava/util/Collection;)Z
356+
public fun equals (Ljava/lang/Object;)Z
357+
public final fun getFirst ()Lkotlinx/datetime/LocalDate;
358+
public final fun getLast ()Lkotlinx/datetime/LocalDate;
359+
public fun getSize ()I
360+
public fun hashCode ()I
361+
public fun isEmpty ()Z
362+
public fun iterator ()Ljava/util/Iterator;
363+
public fun remove (Ljava/lang/Object;)Z
364+
public fun removeAll (Ljava/util/Collection;)Z
365+
public fun removeIf (Ljava/util/function/Predicate;)Z
366+
public fun retainAll (Ljava/util/Collection;)Z
367+
public final fun size ()I
368+
public fun toArray ()[Ljava/lang/Object;
369+
public fun toArray ([Ljava/lang/Object;)[Ljava/lang/Object;
370+
public fun toString ()Ljava/lang/String;
371+
}
372+
373+
public final class kotlinx/datetime/LocalDateProgression$Companion {
374+
}
375+
376+
public final class kotlinx/datetime/LocalDateRange : kotlinx/datetime/LocalDateProgression, kotlin/ranges/ClosedRange, kotlin/ranges/OpenEndRange {
377+
public static final field Companion Lkotlinx/datetime/LocalDateRange$Companion;
378+
public fun <init> (Lkotlinx/datetime/LocalDate;Lkotlinx/datetime/LocalDate;)V
379+
public synthetic fun contains (Ljava/lang/Comparable;)Z
380+
public fun contains (Lkotlinx/datetime/LocalDate;)Z
381+
public synthetic fun getEndExclusive ()Ljava/lang/Comparable;
382+
public fun getEndExclusive ()Lkotlinx/datetime/LocalDate;
383+
public synthetic fun getEndInclusive ()Ljava/lang/Comparable;
384+
public fun getEndInclusive ()Lkotlinx/datetime/LocalDate;
385+
public synthetic fun getStart ()Ljava/lang/Comparable;
386+
public fun getStart ()Lkotlinx/datetime/LocalDate;
387+
public fun isEmpty ()Z
388+
public fun toString ()Ljava/lang/String;
389+
}
390+
391+
public final class kotlinx/datetime/LocalDateRange$Companion {
392+
public final fun getEMPTY ()Lkotlinx/datetime/LocalDateRange;
393+
}
394+
395+
public final class kotlinx/datetime/LocalDateRangeKt {
396+
public static final fun downTo (Lkotlinx/datetime/LocalDate;Lkotlinx/datetime/LocalDate;)Lkotlinx/datetime/LocalDateProgression;
397+
public static final fun first (Lkotlinx/datetime/LocalDateProgression;)Lkotlinx/datetime/LocalDate;
398+
public static final fun firstOrNull (Lkotlinx/datetime/LocalDateProgression;)Lkotlinx/datetime/LocalDate;
399+
public static final fun last (Lkotlinx/datetime/LocalDateProgression;)Lkotlinx/datetime/LocalDate;
400+
public static final fun lastOrNull (Lkotlinx/datetime/LocalDateProgression;)Lkotlinx/datetime/LocalDate;
401+
public static final fun random (Lkotlinx/datetime/LocalDateProgression;Lkotlin/random/Random;)Lkotlinx/datetime/LocalDate;
402+
public static synthetic fun random$default (Lkotlinx/datetime/LocalDateProgression;Lkotlin/random/Random;ILjava/lang/Object;)Lkotlinx/datetime/LocalDate;
403+
public static final fun randomOrNull (Lkotlinx/datetime/LocalDateProgression;Lkotlin/random/Random;)Lkotlinx/datetime/LocalDate;
404+
public static synthetic fun randomOrNull$default (Lkotlinx/datetime/LocalDateProgression;Lkotlin/random/Random;ILjava/lang/Object;)Lkotlinx/datetime/LocalDate;
405+
public static final fun reversed (Lkotlinx/datetime/LocalDateProgression;)Lkotlinx/datetime/LocalDateProgression;
406+
public static final fun step (Lkotlinx/datetime/LocalDateProgression;ILkotlinx/datetime/DateTimeUnit$DayBased;)Lkotlinx/datetime/LocalDateProgression;
407+
public static final fun step (Lkotlinx/datetime/LocalDateProgression;JLkotlinx/datetime/DateTimeUnit$DayBased;)Lkotlinx/datetime/LocalDateProgression;
408+
}
409+
345410
public final class kotlinx/datetime/LocalDateTime : java/io/Serializable, java/lang/Comparable {
346411
public static final field Companion Lkotlinx/datetime/LocalDateTime$Companion;
347412
public fun <init> (IIIIIII)V

core/api/kotlinx-datetime.klib.api

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,8 @@ final class kotlinx.datetime/LocalDate : kotlin/Comparable<kotlinx.datetime/Loca
355355
final fun compareTo(kotlinx.datetime/LocalDate): kotlin/Int // kotlinx.datetime/LocalDate.compareTo|compareTo(kotlinx.datetime.LocalDate){}[0]
356356
final fun equals(kotlin/Any?): kotlin/Boolean // kotlinx.datetime/LocalDate.equals|equals(kotlin.Any?){}[0]
357357
final fun hashCode(): kotlin/Int // kotlinx.datetime/LocalDate.hashCode|hashCode(){}[0]
358+
final fun rangeTo(kotlinx.datetime/LocalDate): kotlinx.datetime/LocalDateRange // kotlinx.datetime/LocalDate.rangeTo|rangeTo(kotlinx.datetime.LocalDate){}[0]
359+
final fun rangeUntil(kotlinx.datetime/LocalDate): kotlinx.datetime/LocalDateRange // kotlinx.datetime/LocalDate.rangeUntil|rangeUntil(kotlinx.datetime.LocalDate){}[0]
358360
final fun toEpochDays(): kotlin/Long // kotlinx.datetime/LocalDate.toEpochDays|toEpochDays(){}[0]
359361
final fun toString(): kotlin/String // kotlinx.datetime/LocalDate.toString|toString(){}[0]
360362

@@ -375,6 +377,26 @@ final class kotlinx.datetime/LocalDate : kotlin/Comparable<kotlinx.datetime/Loca
375377
}
376378
}
377379

380+
final class kotlinx.datetime/LocalDateRange : kotlin.ranges/ClosedRange<kotlinx.datetime/LocalDate>, kotlin.ranges/OpenEndRange<kotlinx.datetime/LocalDate>, kotlinx.datetime/LocalDateProgression { // kotlinx.datetime/LocalDateRange|null[0]
381+
constructor <init>(kotlinx.datetime/LocalDate, kotlinx.datetime/LocalDate) // kotlinx.datetime/LocalDateRange.<init>|<init>(kotlinx.datetime.LocalDate;kotlinx.datetime.LocalDate){}[0]
382+
383+
final val endExclusive // kotlinx.datetime/LocalDateRange.endExclusive|{}endExclusive[0]
384+
final fun <get-endExclusive>(): kotlinx.datetime/LocalDate // kotlinx.datetime/LocalDateRange.endExclusive.<get-endExclusive>|<get-endExclusive>(){}[0]
385+
final val endInclusive // kotlinx.datetime/LocalDateRange.endInclusive|{}endInclusive[0]
386+
final fun <get-endInclusive>(): kotlinx.datetime/LocalDate // kotlinx.datetime/LocalDateRange.endInclusive.<get-endInclusive>|<get-endInclusive>(){}[0]
387+
final val start // kotlinx.datetime/LocalDateRange.start|{}start[0]
388+
final fun <get-start>(): kotlinx.datetime/LocalDate // kotlinx.datetime/LocalDateRange.start.<get-start>|<get-start>(){}[0]
389+
390+
final fun contains(kotlinx.datetime/LocalDate): kotlin/Boolean // kotlinx.datetime/LocalDateRange.contains|contains(kotlinx.datetime.LocalDate){}[0]
391+
final fun isEmpty(): kotlin/Boolean // kotlinx.datetime/LocalDateRange.isEmpty|isEmpty(){}[0]
392+
final fun toString(): kotlin/String // kotlinx.datetime/LocalDateRange.toString|toString(){}[0]
393+
394+
final object Companion { // kotlinx.datetime/LocalDateRange.Companion|null[0]
395+
final val EMPTY // kotlinx.datetime/LocalDateRange.Companion.EMPTY|{}EMPTY[0]
396+
final fun <get-EMPTY>(): kotlinx.datetime/LocalDateRange // kotlinx.datetime/LocalDateRange.Companion.EMPTY.<get-EMPTY>|<get-EMPTY>(){}[0]
397+
}
398+
}
399+
378400
final class kotlinx.datetime/LocalDateTime : kotlin/Comparable<kotlinx.datetime/LocalDateTime> { // kotlinx.datetime/LocalDateTime|null[0]
379401
constructor <init>(kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int = ..., kotlin/Int = ...) // kotlinx.datetime/LocalDateTime.<init>|<init>(kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int){}[0]
380402
constructor <init>(kotlin/Int, kotlinx.datetime/Month, kotlin/Int, kotlin/Int, kotlin/Int, kotlin/Int = ..., kotlin/Int = ...) // kotlinx.datetime/LocalDateTime.<init>|<init>(kotlin.Int;kotlinx.datetime.Month;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int){}[0]
@@ -489,6 +511,25 @@ final class kotlinx.datetime/UtcOffset { // kotlinx.datetime/UtcOffset|null[0]
489511
}
490512
}
491513

514+
open class kotlinx.datetime/LocalDateProgression : kotlin.collections/Collection<kotlinx.datetime/LocalDate> { // kotlinx.datetime/LocalDateProgression|null[0]
515+
final val first // kotlinx.datetime/LocalDateProgression.first|{}first[0]
516+
final fun <get-first>(): kotlinx.datetime/LocalDate // kotlinx.datetime/LocalDateProgression.first.<get-first>|<get-first>(){}[0]
517+
final val last // kotlinx.datetime/LocalDateProgression.last|{}last[0]
518+
final fun <get-last>(): kotlinx.datetime/LocalDate // kotlinx.datetime/LocalDateProgression.last.<get-last>|<get-last>(){}[0]
519+
open val size // kotlinx.datetime/LocalDateProgression.size|{}size[0]
520+
open fun <get-size>(): kotlin/Int // kotlinx.datetime/LocalDateProgression.size.<get-size>|<get-size>(){}[0]
521+
522+
open fun contains(kotlinx.datetime/LocalDate): kotlin/Boolean // kotlinx.datetime/LocalDateProgression.contains|contains(kotlinx.datetime.LocalDate){}[0]
523+
open fun containsAll(kotlin.collections/Collection<kotlinx.datetime/LocalDate>): kotlin/Boolean // kotlinx.datetime/LocalDateProgression.containsAll|containsAll(kotlin.collections.Collection<kotlinx.datetime.LocalDate>){}[0]
524+
open fun equals(kotlin/Any?): kotlin/Boolean // kotlinx.datetime/LocalDateProgression.equals|equals(kotlin.Any?){}[0]
525+
open fun hashCode(): kotlin/Int // kotlinx.datetime/LocalDateProgression.hashCode|hashCode(){}[0]
526+
open fun isEmpty(): kotlin/Boolean // kotlinx.datetime/LocalDateProgression.isEmpty|isEmpty(){}[0]
527+
open fun iterator(): kotlin.collections/Iterator<kotlinx.datetime/LocalDate> // kotlinx.datetime/LocalDateProgression.iterator|iterator(){}[0]
528+
open fun toString(): kotlin/String // kotlinx.datetime/LocalDateProgression.toString|toString(){}[0]
529+
530+
final object Companion // kotlinx.datetime/LocalDateProgression.Companion|null[0]
531+
}
532+
492533
open class kotlinx.datetime/TimeZone { // kotlinx.datetime/TimeZone|null[0]
493534
open val id // kotlinx.datetime/TimeZone.id|{}id[0]
494535
open fun <get-id>(): kotlin/String // kotlinx.datetime/TimeZone.id.<get-id>|<get-id>(){}[0]
@@ -864,6 +905,7 @@ final fun (kotlinx.datetime/LocalDate).kotlinx.datetime/atStartOfDayIn(kotlinx.d
864905
final fun (kotlinx.datetime/LocalDate).kotlinx.datetime/atTime(kotlin/Int, kotlin/Int, kotlin/Int = ..., kotlin/Int = ...): kotlinx.datetime/LocalDateTime // kotlinx.datetime/atTime|[email protected](kotlin.Int;kotlin.Int;kotlin.Int;kotlin.Int){}[0]
865906
final fun (kotlinx.datetime/LocalDate).kotlinx.datetime/atTime(kotlinx.datetime/LocalTime): kotlinx.datetime/LocalDateTime // kotlinx.datetime/atTime|[email protected](kotlinx.datetime.LocalTime){}[0]
866907
final fun (kotlinx.datetime/LocalDate).kotlinx.datetime/daysUntil(kotlinx.datetime/LocalDate): kotlin/Int // kotlinx.datetime/daysUntil|[email protected](kotlinx.datetime.LocalDate){}[0]
908+
final fun (kotlinx.datetime/LocalDate).kotlinx.datetime/downTo(kotlinx.datetime/LocalDate): kotlinx.datetime/LocalDateProgression // kotlinx.datetime/downTo|[email protected](kotlinx.datetime.LocalDate){}[0]
867909
final fun (kotlinx.datetime/LocalDate).kotlinx.datetime/format(kotlinx.datetime.format/DateTimeFormat<kotlinx.datetime/LocalDate>): kotlin/String // kotlinx.datetime/format|[email protected](kotlinx.datetime.format.DateTimeFormat<kotlinx.datetime.LocalDate>){}[0]
868910
final fun (kotlinx.datetime/LocalDate).kotlinx.datetime/minus(kotlin/Int, kotlinx.datetime/DateTimeUnit.DateBased): kotlinx.datetime/LocalDate // kotlinx.datetime/minus|[email protected](kotlin.Int;kotlinx.datetime.DateTimeUnit.DateBased){}[0]
869911
final fun (kotlinx.datetime/LocalDate).kotlinx.datetime/minus(kotlin/Long, kotlinx.datetime/DateTimeUnit.DateBased): kotlinx.datetime/LocalDate // kotlinx.datetime/minus|[email protected](kotlin.Long;kotlinx.datetime.DateTimeUnit.DateBased){}[0]
@@ -878,6 +920,15 @@ final fun (kotlinx.datetime/LocalDate).kotlinx.datetime/plus(kotlinx.datetime/Da
878920
final fun (kotlinx.datetime/LocalDate).kotlinx.datetime/plus(kotlinx.datetime/DateTimeUnit.DateBased): kotlinx.datetime/LocalDate // kotlinx.datetime/plus|[email protected](kotlinx.datetime.DateTimeUnit.DateBased){}[0]
879921
final fun (kotlinx.datetime/LocalDate).kotlinx.datetime/until(kotlinx.datetime/LocalDate, kotlinx.datetime/DateTimeUnit.DateBased): kotlin/Long // kotlinx.datetime/until|[email protected](kotlinx.datetime.LocalDate;kotlinx.datetime.DateTimeUnit.DateBased){}[0]
880922
final fun (kotlinx.datetime/LocalDate).kotlinx.datetime/yearsUntil(kotlinx.datetime/LocalDate): kotlin/Int // kotlinx.datetime/yearsUntil|[email protected](kotlinx.datetime.LocalDate){}[0]
923+
final fun (kotlinx.datetime/LocalDateProgression).kotlinx.datetime/first(): kotlinx.datetime/LocalDate // kotlinx.datetime/first|[email protected](){}[0]
924+
final fun (kotlinx.datetime/LocalDateProgression).kotlinx.datetime/firstOrNull(): kotlinx.datetime/LocalDate? // kotlinx.datetime/firstOrNull|[email protected](){}[0]
925+
final fun (kotlinx.datetime/LocalDateProgression).kotlinx.datetime/last(): kotlinx.datetime/LocalDate // kotlinx.datetime/last|[email protected](){}[0]
926+
final fun (kotlinx.datetime/LocalDateProgression).kotlinx.datetime/lastOrNull(): kotlinx.datetime/LocalDate? // kotlinx.datetime/lastOrNull|[email protected](){}[0]
927+
final fun (kotlinx.datetime/LocalDateProgression).kotlinx.datetime/random(kotlin.random/Random = ...): kotlinx.datetime/LocalDate // kotlinx.datetime/random|[email protected](kotlin.random.Random){}[0]
928+
final fun (kotlinx.datetime/LocalDateProgression).kotlinx.datetime/randomOrNull(kotlin.random/Random = ...): kotlinx.datetime/LocalDate? // kotlinx.datetime/randomOrNull|[email protected](kotlin.random.Random){}[0]
929+
final fun (kotlinx.datetime/LocalDateProgression).kotlinx.datetime/reversed(): kotlinx.datetime/LocalDateProgression // kotlinx.datetime/reversed|[email protected](){}[0]
930+
final fun (kotlinx.datetime/LocalDateProgression).kotlinx.datetime/step(kotlin/Int, kotlinx.datetime/DateTimeUnit.DayBased): kotlinx.datetime/LocalDateProgression // kotlinx.datetime/step|[email protected](kotlin.Int;kotlinx.datetime.DateTimeUnit.DayBased){}[0]
931+
final fun (kotlinx.datetime/LocalDateProgression).kotlinx.datetime/step(kotlin/Long, kotlinx.datetime/DateTimeUnit.DayBased): kotlinx.datetime/LocalDateProgression // kotlinx.datetime/step|[email protected](kotlin.Long;kotlinx.datetime.DateTimeUnit.DayBased){}[0]
881932
final fun (kotlinx.datetime/LocalDateTime).kotlinx.datetime/format(kotlinx.datetime.format/DateTimeFormat<kotlinx.datetime/LocalDateTime>): kotlin/String // kotlinx.datetime/format|[email protected](kotlinx.datetime.format.DateTimeFormat<kotlinx.datetime.LocalDateTime>){}[0]
882933
final fun (kotlinx.datetime/LocalDateTime).kotlinx.datetime/toInstant(kotlinx.datetime/TimeZone): kotlinx.datetime/Instant // kotlinx.datetime/toInstant|[email protected](kotlinx.datetime.TimeZone){}[0]
883934
final fun (kotlinx.datetime/LocalDateTime).kotlinx.datetime/toInstant(kotlinx.datetime/UtcOffset): kotlinx.datetime/Instant // kotlinx.datetime/toInstant|[email protected](kotlinx.datetime.UtcOffset){}[0]

core/common/src/LocalDate.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,20 @@ public expect class LocalDate : Comparable<LocalDate> {
246246
*/
247247
public fun toEpochDays(): Long
248248

249+
/**
250+
* Creates a [LocalDateRange] from `this` to [that], inclusive.
251+
*
252+
* @sample kotlinx.datetime.test.samples.LocalDateRangeSamples.simpleRangeCreation
253+
*/
254+
public operator fun rangeTo(that: LocalDate): LocalDateRange
255+
256+
/**
257+
* Creates a [LocalDateRange] from `this` to [that], exclusive, i.e., from this to (that - 1 day)
258+
*
259+
* @sample kotlinx.datetime.test.samples.LocalDateRangeSamples.simpleRangeCreation
260+
*/
261+
public operator fun rangeUntil(that: LocalDate): LocalDateRange
262+
249263
/**
250264
* Compares `this` date with the [other] date.
251265
* Returns zero if this date represents the same day as the other (meaning they are equal to one other),

0 commit comments

Comments
 (0)