Skip to content

Commit 5cfd6c0

Browse files
elizarovfvasco
andauthored
java.time adapter for Flow.debounce and Flow.sample (#1834)
Co-authored-by: Francesco Vasco <[email protected]>
1 parent 4116fbf commit 5cfd6c0

File tree

4 files changed

+92
-0
lines changed

4 files changed

+92
-0
lines changed

integration/kotlinx-coroutines-jdk8/api/kotlinx-coroutines-jdk8.api

+2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@ public final class kotlinx/coroutines/stream/StreamKt {
1212
}
1313

1414
public final class kotlinx/coroutines/time/TimeKt {
15+
public static final fun debounce (Lkotlinx/coroutines/flow/Flow;Ljava/time/Duration;)Lkotlinx/coroutines/flow/Flow;
1516
public static final fun delay (Ljava/time/Duration;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
1617
public static final fun onTimeout (Lkotlinx/coroutines/selects/SelectBuilder;Ljava/time/Duration;Lkotlin/jvm/functions/Function1;)V
18+
public static final fun sample (Lkotlinx/coroutines/flow/Flow;Ljava/time/Duration;)Lkotlinx/coroutines/flow/Flow;
1719
public static final fun withTimeout (Ljava/time/Duration;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
1820
public static final fun withTimeoutOrNull (Ljava/time/Duration;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
1921
}

integration/kotlinx-coroutines-jdk8/src/time/Time.kt

+13
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package kotlinx.coroutines.time
55

66
import kotlinx.coroutines.*
7+
import kotlinx.coroutines.flow.*
78
import kotlinx.coroutines.selects.*
89
import java.time.*
910
import java.time.temporal.*
@@ -14,6 +15,18 @@ import java.time.temporal.*
1415
public suspend fun delay(duration: Duration) =
1516
kotlinx.coroutines.delay(duration.coerceToMillis())
1617

18+
/**
19+
* "java.time" adapter method for [kotlinx.coroutines.flow.debounce].
20+
*/
21+
@FlowPreview
22+
public fun <T> Flow<T>.debounce(timeout: Duration) = debounce(timeout.coerceToMillis())
23+
24+
/**
25+
* "java.time" adapter method for [kotlinx.coroutines.flow.sample].
26+
*/
27+
@FlowPreview
28+
public fun <T> Flow<T>.sample(period: Duration) = sample(period.coerceToMillis())
29+
1730
/**
1831
* "java.time" adapter method for [SelectBuilder.onTimeout].
1932
*/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
5+
package kotlinx.coroutines.time
6+
7+
import kotlinx.coroutines.TestBase
8+
import kotlinx.coroutines.flow.flow
9+
import kotlinx.coroutines.flow.toList
10+
import kotlinx.coroutines.withVirtualTime
11+
import org.junit.Test
12+
import java.time.Duration
13+
import kotlin.test.assertEquals
14+
15+
class FlowDebounceTest : TestBase() {
16+
@Test
17+
public fun testBasic() = withVirtualTime {
18+
expect(1)
19+
val flow = flow {
20+
expect(3)
21+
emit("A")
22+
delay(Duration.ofMillis(1500))
23+
emit("B")
24+
delay(Duration.ofMillis(500))
25+
emit("C")
26+
delay(Duration.ofMillis(250))
27+
emit("D")
28+
delay(Duration.ofMillis(2000))
29+
emit("E")
30+
expect(4)
31+
}
32+
33+
expect(2)
34+
val result = flow.debounce(Duration.ofMillis(1000)).toList()
35+
assertEquals(listOf("A", "D", "E"), result)
36+
finish(5)
37+
}
38+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
5+
package kotlinx.coroutines.time
6+
7+
import kotlinx.coroutines.TestBase
8+
import kotlinx.coroutines.flow.flow
9+
import kotlinx.coroutines.flow.toList
10+
import kotlinx.coroutines.withVirtualTime
11+
import org.junit.Test
12+
import java.time.Duration
13+
import kotlin.test.assertEquals
14+
15+
16+
class SampleTest : TestBase() {
17+
@Test
18+
public fun testBasic() = withVirtualTime {
19+
expect(1)
20+
val flow = flow {
21+
expect(3)
22+
emit("A")
23+
delay(Duration.ofMillis(1500))
24+
emit("B")
25+
delay(Duration.ofMillis(500))
26+
emit("C")
27+
delay(Duration.ofMillis(250))
28+
emit("D")
29+
delay(Duration.ofMillis(2000))
30+
emit("E")
31+
expect(4)
32+
}
33+
34+
expect(2)
35+
val result = flow.sample(Duration.ofMillis(1000)).toList()
36+
assertEquals(listOf("A", "B", "D"), result)
37+
finish(5)
38+
}
39+
}

0 commit comments

Comments
 (0)