aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Jaros <rjaros@finn.pl>2020-05-20 18:26:12 +0200
committerRobert Jaros <rjaros@finn.pl>2020-05-20 18:26:12 +0200
commit18af38d4ac7bbc33a43115c99ed47a586acf6020 (patch)
tree0784c1a80e0f9194bb692d66894b84487ca1238a
parent043ce3ebb6c5b0301b5f954b7b74942be404da2d (diff)
downloadkvision-18af38d4ac7bbc33a43115c99ed47a586acf6020.tar.gz
kvision-18af38d4ac7bbc33a43115c99ed47a586acf6020.tar.bz2
kvision-18af38d4ac7bbc33a43115c99ed47a586acf6020.zip
Add stateFlow extension property for an ObservableState.
-rw-r--r--kvision-modules/kvision-event-flow/src/main/kotlin/pl/treksoft/kvision/event/EventFlow.kt24
1 files changed, 24 insertions, 0 deletions
diff --git a/kvision-modules/kvision-event-flow/src/main/kotlin/pl/treksoft/kvision/event/EventFlow.kt b/kvision-modules/kvision-event-flow/src/main/kotlin/pl/treksoft/kvision/event/EventFlow.kt
index f9556e62..dc40beba 100644
--- a/kvision-modules/kvision-event-flow/src/main/kotlin/pl/treksoft/kvision/event/EventFlow.kt
+++ b/kvision-modules/kvision-event-flow/src/main/kotlin/pl/treksoft/kvision/event/EventFlow.kt
@@ -24,11 +24,17 @@ package pl.treksoft.kvision.event
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.callbackFlow
import org.w3c.dom.events.Event
import pl.treksoft.kvision.core.Widget
import pl.treksoft.kvision.core.onEvent
+import pl.treksoft.kvision.state.ObservableState
+/**
+ * Extension property returning Flow<Pair<Widget, Event>> for a given event
+ */
@OptIn(ExperimentalCoroutinesApi::class)
inline fun <reified T : Widget> T.eventFlow(event: String): Flow<Pair<T, Event>> = callbackFlow {
val id = onEvent {
@@ -41,6 +47,9 @@ inline fun <reified T : Widget> T.eventFlow(event: String): Flow<Pair<T, Event>>
}
}
+/**
+ * Extension property returning Flow<Widget> for a click event.
+ */
@OptIn(ExperimentalCoroutinesApi::class)
inline val <reified T : Widget> T.clickFlow: Flow<T>
get() = callbackFlow {
@@ -54,6 +63,9 @@ inline val <reified T : Widget> T.clickFlow: Flow<T>
}
}
+/**
+ * Extension property returning Flow<Widget> for an input event.
+ */
@OptIn(ExperimentalCoroutinesApi::class)
inline val <reified T : Widget> T.inputFlow: Flow<T>
get() = callbackFlow {
@@ -67,6 +79,9 @@ inline val <reified T : Widget> T.inputFlow: Flow<T>
}
}
+/**
+ * Extension property returning Flow<Widget> for a change event.
+ */
@OptIn(ExperimentalCoroutinesApi::class)
inline val <reified T : Widget> T.changeFlow: Flow<T>
get() = callbackFlow {
@@ -79,3 +94,12 @@ inline val <reified T : Widget> T.changeFlow: Flow<T>
removeEventListener(id)
}
}
+
+/**
+ * Extension property returning StateFlow<S> for an ObservableState<S>.
+ */
+@OptIn(ExperimentalCoroutinesApi::class)
+inline val <S> ObservableState<S>.stateFlow: StateFlow<S>
+ get() = MutableStateFlow(getState()).apply {
+ this@stateFlow.subscribe { this.value = it }
+ }