From 7a49ca16c772cd6b8ec7bdce7fcd27e78c2f13ce Mon Sep 17 00:00:00 2001 From: Francesco Vasco Date: Fri, 28 Feb 2020 17:06:43 +0100 Subject: [PATCH 1/2] java.time adapter for Flow.debounce and Flow.sample --- .../kotlinx-coroutines-jdk8/src/time/Time.kt | 13 +++++++ .../test/time/FlowDebounceTest.kt | 38 ++++++++++++++++++ .../test/time/FlowSampleTest.kt | 39 +++++++++++++++++++ 3 files changed, 90 insertions(+) create mode 100644 integration/kotlinx-coroutines-jdk8/test/time/FlowDebounceTest.kt create mode 100644 integration/kotlinx-coroutines-jdk8/test/time/FlowSampleTest.kt diff --git a/integration/kotlinx-coroutines-jdk8/src/time/Time.kt b/integration/kotlinx-coroutines-jdk8/src/time/Time.kt index 1673116fac..56f1e26d85 100644 --- a/integration/kotlinx-coroutines-jdk8/src/time/Time.kt +++ b/integration/kotlinx-coroutines-jdk8/src/time/Time.kt @@ -4,6 +4,7 @@ package kotlinx.coroutines.time import kotlinx.coroutines.* +import kotlinx.coroutines.flow.* import kotlinx.coroutines.selects.* import java.time.* import java.time.temporal.* @@ -14,6 +15,18 @@ import java.time.temporal.* public suspend fun delay(duration: Duration) = kotlinx.coroutines.delay(duration.coerceToMillis()) +/** + * "java.time" adapter method for [kotlinx.coroutines.flow.debounce]. + */ +@FlowPreview +public fun Flow.debounce(timeout: Duration) = debounce(timeout.coerceToMillis()) + +/** + * "java.time" adapter method for [kotlinx.coroutines.flow.sample]. + */ +@FlowPreview +public fun Flow.sample(period: Duration) = sample(period.coerceToMillis()) + /** * "java.time" adapter method for [SelectBuilder.onTimeout]. */ diff --git a/integration/kotlinx-coroutines-jdk8/test/time/FlowDebounceTest.kt b/integration/kotlinx-coroutines-jdk8/test/time/FlowDebounceTest.kt new file mode 100644 index 0000000000..d6b2b8c105 --- /dev/null +++ b/integration/kotlinx-coroutines-jdk8/test/time/FlowDebounceTest.kt @@ -0,0 +1,38 @@ +/* + * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.time + +import kotlinx.coroutines.TestBase +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.toList +import kotlinx.coroutines.withVirtualTime +import org.junit.Test +import java.time.Duration +import kotlin.test.assertEquals + +class FlowDebounceTest : TestBase() { + @Test + public fun testBasic() = withVirtualTime { + expect(1) + val flow = flow { + expect(3) + emit("A") + delay(Duration.ofMillis(1500)) + emit("B") + delay(Duration.ofMillis(500)) + emit("C") + delay(Duration.ofMillis(250)) + emit("D") + delay(Duration.ofMillis(2000)) + emit("E") + expect(4) + } + + expect(2) + val result = flow.debounce(Duration.ofMillis(1000)).toList() + assertEquals(listOf("A", "D", "E"), result) + finish(5) + } +} \ No newline at end of file diff --git a/integration/kotlinx-coroutines-jdk8/test/time/FlowSampleTest.kt b/integration/kotlinx-coroutines-jdk8/test/time/FlowSampleTest.kt new file mode 100644 index 0000000000..11ceb1a831 --- /dev/null +++ b/integration/kotlinx-coroutines-jdk8/test/time/FlowSampleTest.kt @@ -0,0 +1,39 @@ +/* + * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.time + +import kotlinx.coroutines.TestBase +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.toList +import kotlinx.coroutines.withVirtualTime +import org.junit.Test +import java.time.Duration +import kotlin.test.assertEquals + + +class SampleTest : TestBase() { + @Test + public fun testBasic() = withVirtualTime { + expect(1) + val flow = flow { + expect(3) + emit("A") + delay(Duration.ofMillis(1500)) + emit("B") + delay(Duration.ofMillis(500)) + emit("C") + delay(Duration.ofMillis(250)) + emit("D") + delay(Duration.ofMillis(2000)) + emit("E") + expect(4) + } + + expect(2) + val result = flow.sample(Duration.ofMillis(1000)).toList() + assertEquals(listOf("A", "B", "D"), result) + finish(5) + } +} From 9c930edd9ff5bdfa40bb35059ca0856a543c1ab4 Mon Sep 17 00:00:00 2001 From: Roman Elizarov Date: Fri, 13 Mar 2020 14:17:02 +0300 Subject: [PATCH 2/2] Updated API dump --- .../kotlinx-coroutines-jdk8/api/kotlinx-coroutines-jdk8.api | 2 ++ 1 file changed, 2 insertions(+) diff --git a/integration/kotlinx-coroutines-jdk8/api/kotlinx-coroutines-jdk8.api b/integration/kotlinx-coroutines-jdk8/api/kotlinx-coroutines-jdk8.api index 417407dd14..4ee57845b2 100644 --- a/integration/kotlinx-coroutines-jdk8/api/kotlinx-coroutines-jdk8.api +++ b/integration/kotlinx-coroutines-jdk8/api/kotlinx-coroutines-jdk8.api @@ -12,8 +12,10 @@ public final class kotlinx/coroutines/stream/StreamKt { } public final class kotlinx/coroutines/time/TimeKt { + public static final fun debounce (Lkotlinx/coroutines/flow/Flow;Ljava/time/Duration;)Lkotlinx/coroutines/flow/Flow; public static final fun delay (Ljava/time/Duration;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun onTimeout (Lkotlinx/coroutines/selects/SelectBuilder;Ljava/time/Duration;Lkotlin/jvm/functions/Function1;)V + public static final fun sample (Lkotlinx/coroutines/flow/Flow;Ljava/time/Duration;)Lkotlinx/coroutines/flow/Flow; public static final fun withTimeout (Ljava/time/Duration;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun withTimeoutOrNull (Ljava/time/Duration;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; }