
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