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

org.fernice.reflare.util.ObservableCollection.kt Maven / Gradle / Ivy

The newest version!
/*
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */

package org.fernice.reflare.util

internal fun  observableMutableSetOf(vararg elements: E): ObservableMutableSet {
    return ObservableMutableSetWrapper(mutableSetOf(*elements))
}

internal inline fun  observableMutableSetOf(elements: Collection, noinline listener: () -> Unit): ObservableMutableSet {
    val list = observableMutableSetOf(*elements.toTypedArray())
    list.addInvalidationListener(listener)
    return list
}

internal fun  observableMutableSetOf(listener: () -> Unit): ObservableMutableSet {
    val list = observableMutableSetOf()
    list.addInvalidationListener(listener)
    return list
}

internal interface ObservableCollection {

    fun addInvalidationListener(listener: () -> Unit)
    fun removeInvalidationListener(listener: () -> Unit)
}

internal interface ObservableMutableSet : MutableSet, ObservableCollection

private abstract class ObservableCollectionWrapperBase>(protected val delegate: S) : Collection, ObservableCollection {

    protected fun mutableIterator(): Iterator = MutableIteratorWrapper(iterator() as MutableIterator)

    protected inline fun  withInvalidation(block: () -> R): R {
        val result = block()
        invalidated()
        return result
    }

    protected inline fun withConditionalInvalidation(block: () -> Boolean): Boolean {
        val result = block()
        if (result) {
            invalidated()
        }
        return result
    }

    private fun invalidated() {
        listeners.forEach { it() }
    }

    private val listeners = mutableListOf<() -> Unit>()

    override fun addInvalidationListener(listener: () -> Unit) {
        listeners.add(listener)
    }

    override fun removeInvalidationListener(listener: () -> Unit) {
        listeners.remove(listener)
    }

    private inner class MutableIteratorWrapper(private val iterator: MutableIterator) : MutableIterator {

        override fun hasNext(): Boolean = iterator.hasNext()
        override fun next(): E = iterator.next()

        override fun remove() = withInvalidation { iterator.remove() }
    }
}

private open class ObservableSetWrapper>(delegate: S) : ObservableCollectionWrapperBase(delegate), Set {

    override val size: Int
        get() = delegate.size

    override fun contains(element: E): Boolean = delegate.contains(element)
    override fun containsAll(elements: Collection): Boolean = delegate.containsAll(elements)
    override fun isEmpty(): Boolean = delegate.isEmpty()
    override fun iterator(): Iterator = delegate.iterator()
}

private class ObservableMutableSetWrapper(delegate: MutableSet) : ObservableSetWrapper>(delegate), MutableSet,
    ObservableMutableSet {

    override fun add(element: E): Boolean = withConditionalInvalidation { delegate.add(element) }
    override fun addAll(elements: Collection): Boolean = withConditionalInvalidation { delegate.addAll(elements) }

    override fun remove(element: E): Boolean = withConditionalInvalidation { delegate.remove(element) }
    override fun removeAll(elements: Collection): Boolean = withConditionalInvalidation { delegate.removeAll(elements) }

    override fun retainAll(elements: Collection): Boolean = withConditionalInvalidation { delegate.retainAll(elements) }

    override fun clear() = withInvalidation { delegate.clear() }

    override fun iterator(): MutableIterator = delegate.iterator()
}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy