commonMain.com.outsidesource.oskitcompose.interactor.InteractorUI.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of oskit-compose Show documentation
Show all versions of oskit-compose Show documentation
An opinionated architecture/library for Compose Multiplatform development
The newest version!
package com.outsidesource.oskitcompose.interactor
import androidx.compose.runtime.*
import com.outsidesource.oskitkmp.interactor.IInteractor
import com.outsidesource.oskitkmp.interactor.Interactor
import kotlinx.coroutines.flow.Flow
/**
* [rememberInteractor] will remember an Interactor and subscribe to its state.
*/
@Composable
fun IInteractor.collectAsState(): S = remember(this) { flow() }.collectAsState(state).value
/**
* [rememberInteractor] will remember an Interactor and subscribe to its state.
*/
@Composable
fun , S> rememberInteractor(factory: () -> B): Pair = rememberInteractor(
rememberFactory = { remember { it() } },
interactorFactory = factory,
)
/**
* []rememberInteractor] will remember an Interactor and subscribe to its state for the lifetime of the keys provided.
*/
@Composable
fun , S> rememberInteractor(
key1: Any? = Unit,
factory: () -> B,
): Pair = rememberInteractor(
rememberFactory = { remember(key1) { it() } },
interactorFactory = factory,
)
/**
* [rememberInteractor] will remember an Interactor and subscribe to its state for the lifetime of the keys provided.
*/
@Composable
fun , S> rememberInteractor(
key1: Any? = Unit,
key2: Any? = Unit,
factory: () -> B,
): Pair = rememberInteractor(
rememberFactory = { remember(key1, key2) { it() } },
interactorFactory = factory,
)
/**
* [rememberInteractor] will remember an Interactor and subscribe to its state for the lifetime of the keys provided.
*/
@Composable
fun , S> rememberInteractor(
key1: Any? = Unit,
key2: Any? = Unit,
key3: Any? = Unit,
factory: () -> B,
): Pair = rememberInteractor(
rememberFactory = { remember(key1, key2, key3) { it() } },
interactorFactory = factory,
)
/**
* [rememberInteractor] will remember an Interactor and subscribe to its state for the lifetime of the keys provided.
*/
@Composable
private fun , S> rememberInteractor(
rememberFactory: @Composable (@DisallowComposableCalls () -> Pair>) -> Pair>,
interactorFactory: () -> B,
): Pair {
val (interactor, flow) = rememberFactory {
val interactor = interactorFactory()
Pair(interactor, interactor.flow())
}
val state by flow.collectAsState(initial = interactor.state)
return Pair(state, interactor)
}