4
4
package kotlinx.coroutines.time
5
5
6
6
import kotlinx.coroutines.CoroutineScope
7
+ import kotlinx.coroutines.coroutineScope
7
8
import kotlinx.coroutines.selects.SelectBuilder
8
9
import java.time.Duration
9
- import java.util.concurrent.TimeUnit
10
+ import java.time.temporal.ChronoUnit
11
+ import kotlin.coroutines.suspendCoroutine
10
12
11
13
/* *
12
14
* "java.time" adapter method for [kotlinx.coroutines.delay]
13
15
*/
14
- public suspend fun delay (duration : Duration ) =
15
- kotlinx.coroutines.delay(duration.toMillis())
16
+ suspend fun delay (duration : Duration ) {
17
+ when {
18
+ duration.seconds < Long .MAX_VALUE / 1_000L -> kotlinx.coroutines.delay(duration.toMillis())
19
+ duration == ChronoUnit .FOREVER .duration -> suspendCoroutine<Unit > { }
20
+ else -> {
21
+ kotlinx.coroutines.delay(duration.seconds * 1_000L )
22
+ kotlinx.coroutines.delay(duration.nano / 1_000_000L )
23
+ }
24
+ }
25
+ }
16
26
17
27
/* *
18
28
* "java.time" adapter method for [SelectBuilder.onTimeout]
19
29
*/
20
- public fun <R > SelectBuilder<R>.onTimeout (duration : Duration , block : suspend () -> R ) =
21
- onTimeout(duration.toMillis(), block)
30
+ public fun <R > SelectBuilder<R>.onTimeout (duration : Duration , block : suspend () -> R ) {
31
+ if (duration != ChronoUnit .FOREVER .duration) {
32
+ onTimeout(duration.toMillis(), block)
33
+ }
34
+ }
22
35
23
36
/* *
24
37
* "java.time" adapter method for [kotlinx.coroutines.withTimeout]
25
38
*/
26
39
public suspend fun <T > withTimeout (duration : Duration , block : suspend CoroutineScope .() -> T ): T =
27
- kotlinx.coroutines.withTimeout(duration.toMillis(), block)
40
+ if (duration == ChronoUnit .FOREVER .duration) coroutineScope { block() }
41
+ else kotlinx.coroutines.withTimeout(duration.toMillis(), block)
28
42
29
43
/* *
30
44
* "java.time" adapter method for [kotlinx.coroutines.withTimeoutOrNull]
31
45
*/
32
46
public suspend fun <T > withTimeoutOrNull (duration : Duration , block : suspend CoroutineScope .() -> T ): T ? =
33
- kotlinx.coroutines.withTimeoutOrNull(duration.toMillis(), block)
47
+ if (duration == ChronoUnit .FOREVER .duration) coroutineScope { block() }
48
+ else kotlinx.coroutines.withTimeoutOrNull(duration.toMillis(), block)
0 commit comments