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

commonMain.co.touchlab.stately.isolate.IsoState.kt Maven / Gradle / Ivy

package co.touchlab.stately.isolate

expect class StateHolder internal constructor(t: T, stateRunner: StateRunner) {
    val myThread: Boolean
    val stateRunner: StateRunner
    val myState: T
    fun dispose()
}

open class IsolateState constructor(private val stateHolder: StateHolder) {
    constructor(producer: () -> T) : this(createState(producer))

    fun  fork(r: R): StateHolder = if (stateHolder.myThread) {
        StateHolder(r, stateHolder.stateRunner)
    } else {
        throw IllegalStateException("Must fork state from the state thread")
    }

    fun  access(block: (T) -> R): R {
        return if (stateHolder.myThread) {
            block(stateHolder.myState)
        } else {
            stateHolder.stateRunner.stateRun {
                block(stateHolder.myState)
            }
        }
    }

    fun dispose() = if (stateHolder.myThread) {
        stateHolder.dispose()
    } else {
        stateHolder.stateRunner.stateRun {
            stateHolder.dispose()
        }
    }
}

internal expect val defaultStateRunner: StateRunner

fun  createState(producer: () -> T, stateRunner: StateRunner = defaultStateRunner): StateHolder =
    stateRunner.stateRun { StateHolder(producer(), stateRunner) }

internal sealed class RunResult
internal data class Ok(val result: T) : RunResult()
internal data class Thrown(val throwable: Throwable) : RunResult()




© 2015 - 2025 Weber Informatics LLC | Privacy Policy