All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.com.outsidesource.oskitcompose.interactor.InteractorUI.kt Maven / Gradle / Ivy

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)
}