aboutsummaryrefslogtreecommitdiff
path: root/kvision-modules/kvision-event-flow/src/main/kotlin
diff options
context:
space:
mode:
Diffstat (limited to 'kvision-modules/kvision-event-flow/src/main/kotlin')
-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 }
+ }