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

commonMain.io.nacular.doodle.utils.Cancelable.kt Maven / Gradle / Ivy

package io.nacular.doodle.utils

import io.nacular.doodle.utils.CompletableImpl.State.Active
import io.nacular.doodle.utils.CompletableImpl.State.Canceled
import io.nacular.doodle.utils.CompletableImpl.State.Completed
import kotlin.js.JsName


public interface Completable: Cancelable {
    public val completed: Pool<(source: Completable) -> Unit>
    public val canceled : Pool<(source: Completable) -> Unit>
}

internal class NoOpPool: Pool<(source: T) -> Unit> {
    override fun plusAssign(item: (source: T) -> Unit) {}

    override fun minusAssign(item: (source: T) -> Unit) {}
}

internal class InstantPool(private val source: T): Pool<(source: T) -> Unit> {
    override fun plusAssign(item: (source: T) -> Unit) {
        item(source)
    }

    override fun minusAssign(item: (source: T) -> Unit) {}
}

public open class CompletableImpl: Completable {
    public enum class State { Active, Completed, Canceled }

    protected var state: State = Active
        private set(new) {
            if (field != Active) { return }

            field = new

            when (new) {
                Completed -> {
                    completed_.forEach { it(this) }
                    completed_.clear()
                    completed = InstantPool(this)
                    canceled  = NoOpPool()
                }
                Canceled -> {
                    canceled_.forEach { it(this) }
                    canceled_.clear()
                    canceled  = InstantPool(this)
                    completed = NoOpPool()
                }
                else -> {}
            }
        }

    private val completed_ by lazy { mutableSetOf<(source: Completable) -> Unit>() }
    private val canceled_  by lazy { mutableSetOf<(source: Completable) -> Unit>() }

    override var completed: Pool<(source: Completable) -> Unit> = SetPool(completed_)
        protected set
    override var canceled : Pool<(source: Completable) -> Unit> = SetPool(canceled_ )
        protected set

    override  fun cancel() { state = Canceled }

    @JsName("completedFunc")
    protected open fun completed() { state = Completed }
}

public val NoOpCompletable: Completable = object: CompletableImpl() {
    init {
        completed()
    }
}

public interface Cancelable {
    public fun cancel()
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy