@@ -2,7 +2,6 @@ package no.nav.su.se.bakover.common.tid.periode
2
2
3
3
import arrow.core.Either
4
4
import arrow.core.NonEmptyList
5
- import arrow.core.getOrElse
6
5
import arrow.core.left
7
6
import arrow.core.right
8
7
import java.time.LocalDate
@@ -18,15 +17,15 @@ import java.util.Locale
18
17
open class DatoIntervall (
19
18
val fraOgMed : LocalDate ,
20
19
val tilOgMed : LocalDate ,
21
- ) : Comparable<DatoIntervall> {
20
+ ) {
22
21
23
22
init {
24
23
require(fraOgMed <= tilOgMed) {
25
24
" fraOgMed må være før eller samme dag som tilOgMed"
26
25
}
27
26
}
28
27
29
- override fun compareTo ( other : DatoIntervall ) = compareValuesBy( this , other, { it.fraOgMed }, { it.tilOgMed } )
28
+ constructor (dato : LocalDate ) : this (dato, dato )
30
29
31
30
infix fun inneholder (dato : LocalDate ): Boolean = dato in fraOgMed.. tilOgMed
32
31
@@ -92,12 +91,24 @@ open class DatoIntervall(
92
91
return this == other || sluttStart == plussEnDag || sluttStart == minusEnDag || startSlutt == plussEnDag || startSlutt == minusEnDag
93
92
}
94
93
94
+ infix fun tilst øter (other : LocalDate ): Boolean {
95
+ val dayBeforeStart = fraOgMed.minusDays(1 )
96
+ val dayAfterEnd = tilOgMed.plusDays(1 )
97
+ return other.isEqual(dayBeforeStart) || other.isEqual(dayAfterEnd)
98
+ }
99
+
95
100
infix fun sl åSammen (
96
101
other : DatoIntervall ,
97
102
): Either <DatoIntervallKanIkkeSl åsSammen, DatoIntervall > {
98
103
return slåSammen (other) { fraOgMed, tilOgMed -> DatoIntervall (fraOgMed, tilOgMed) }
99
104
}
100
105
106
+ infix fun sl åSammen (
107
+ other : LocalDate ,
108
+ ): Either <DatoIntervallKanIkkeSl åsSammen, DatoIntervall > {
109
+ return slåSammen (DatoIntervall (other, other)) { fraOgMed, tilOgMed -> DatoIntervall (fraOgMed, tilOgMed) }
110
+ }
111
+
101
112
/* *
102
113
* Slår sammen to perioder dersom minst en måned overlapper eller periodene er tilstøtende.
103
114
*/
@@ -115,6 +126,13 @@ open class DatoIntervall(
115
126
}
116
127
}
117
128
129
+ /* *
130
+ * @return Liste med alle dager i [DatoIntervall], sortert og unike.
131
+ */
132
+ fun dager (): List <LocalDate > {
133
+ return (0 until antallDager()).map { fraOgMed.plusDays(it) }
134
+ }
135
+
118
136
/* *
119
137
* Periode i formatet "dd.MM.yyyy - dd.MM.yyyy".
120
138
*/
@@ -123,10 +141,15 @@ open class DatoIntervall(
123
141
return " ${this .fraOgMed.format(formatter)} - ${this .tilOgMed.format(formatter)} "
124
142
}
125
143
126
- override fun equals (other : Any? ) = other is DatoIntervall && fraOgMed == other.fraOgMed && tilOgMed == other.tilOgMed
144
+ override fun equals (other : Any? ) =
145
+ other is DatoIntervall && fraOgMed == other.fraOgMed && tilOgMed == other.tilOgMed
127
146
128
147
override fun hashCode () = 31 * fraOgMed.hashCode() + tilOgMed.hashCode()
129
148
149
+ override fun toString (): String {
150
+ return " DatoIntervall(fraOgMed=$fraOgMed , tilOgMed=$tilOgMed )"
151
+ }
152
+
130
153
data object DatoIntervallKanIkkeSl åsSammen
131
154
}
132
155
@@ -141,19 +164,21 @@ fun List<DatoIntervall>.minsteAntallSammenhengendePerioder(): List<DatoIntervall
141
164
fun <T : DatoIntervall > List<T>.minsteAntallSammenhengendePerioder (
142
165
create : (fraOgMed: LocalDate , tilOgMed: LocalDate ) -> T ,
143
166
): List <T > {
144
- return sorted().fold(mutableListOf ()) { slåttSammen: MutableList <T >, datoIntervall: T ->
145
- if (slåttSammen.isEmpty()) {
146
- slåttSammen.add(datoIntervall)
147
- } else if (slåttSammen.last().slåSammen (datoIntervall).isRight()) {
148
- val last = slåttSammen.removeLast()
149
- slåttSammen.add(
150
- last.slåSammen (datoIntervall, create).getOrElse { throw IllegalStateException (" Skulle gått bra" ) },
151
- )
152
- } else {
153
- slåttSammen.add(datoIntervall)
167
+ return this .dager()
168
+ .fold(emptyList()) { acc, dato ->
169
+ if (acc.isEmpty()) {
170
+ listOf (DatoIntervall (dato, dato))
171
+ } else {
172
+ acc.last().slåSammen (dato).fold(
173
+ { acc + listOf (DatoIntervall (dato, dato)) },
174
+ { acc.dropLast(1 ) + it },
175
+ )
176
+ }.let {
177
+ it.map {
178
+ create(it.fraOgMed, it.tilOgMed)
179
+ }
180
+ }
154
181
}
155
- slåttSammen
156
- }
157
182
}
158
183
159
184
infix fun List<DatoIntervall>.inneholder (other : List <DatoIntervall >): Boolean =
@@ -176,3 +201,10 @@ fun List<DatoIntervall>.minAndMaxOfOrNull(): DatoIntervall? {
176
201
tilOgMed = this .maxOf { it.tilOgMed },
177
202
)
178
203
}
204
+
205
+ /* *
206
+ * @return Liste med alle dager i alle [DatoIntervall] i listen, sortert og unike.
207
+ */
208
+ fun <T : DatoIntervall > List<T>.dager (): List <LocalDate > {
209
+ return this .flatMap { it.dager() }.distinct().sorted()
210
+ }
0 commit comments