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

org.hnau.emitter.observing.ObservingEmitter.kt Maven / Gradle / Ivy

package org.hnau.emitter.observing

import org.hnau.base.extensions.boolean.ifFalse
import org.hnau.base.extensions.boolean.ifTrue
import org.hnau.emitter.Detacher
import org.hnau.emitter.Emitter
import java.util.concurrent.CopyOnWriteArraySet


abstract class ObservingEmitter : Emitter {

    private val observers = CopyOnWriteArraySet<(T) -> Unit>()

    override fun observe(
            observer: (T) -> Unit
    ): Detacher {
        synchronized(observers) {
            observers.ifEmpty(this::beforeFirstAttached)
            observers.add(observer)
        }
        onAttached(observer)
        return createDetacher(observer)
    }

    protected open fun call(value: T) = synchronized(observers) {
        observers.forEach { observer -> observer(value) }
    }

    protected open fun beforeFirstAttached() {}

    protected open fun onAttached(observer: (T) -> Unit) {}

    protected open fun onDetached(observer: (T) -> Unit) {}

    protected open fun afterLastDetached() {}

    private fun createDetacher(observer: (T) -> Unit) =
            Detacher.create { detach(observer) }

    private fun detach(
            observer: (T) -> Unit
    ) {
        val isEmpty = synchronized(observers) {
            observers.remove(observer).ifFalse { return }
            observers.isEmpty()
        }
        onDetached(observer)
        isEmpty.ifTrue(this::afterLastDetached)
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy