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

ru.hnau.jutils.producer.WrapProducer.kt Maven / Gradle / Ivy

The newest version!
package ru.hnau.jutils.producer

import ru.hnau.jutils.producer.detacher.ProducerDetachers


abstract class WrapProducer(
        private val source: Producer
) : StateProducer() {

    interface Proxy {
        fun call(value: T)
    }

    companion object {

        fun  create(
                source: Producer,
                onWrappedProducerCall: Proxy.(I) -> Unit
        ): Producer = object : WrapProducer(source) {
            override fun onWrappedProducerCall(data: I, proxy: Proxy) =
                    onWrappedProducerCall.invoke(proxy, data)
        }

    }

    private val detachers = ProducerDetachers()

    private val proxy = object : Proxy {
        override fun call(value: O) = update(value)
    }

    abstract fun onWrappedProducerCall(data: I, proxy: Proxy)

    override fun onFirstAttached() {
        super.onFirstAttached()
        source.attach(detachers) { value ->
            onWrappedProducerCall(value, proxy)
        }
    }

    override fun onLastDetached() {
        detachers.detachAllAndClear()
        super.onLastDetached()
    }

}