Fix Observer

Signed-off-by: Chaoscaot <max@maxsp.de>
This commit is contained in:
2026-06-17 21:48:27 +02:00
parent 70c8678c60
commit 7af586ec16
@@ -24,9 +24,9 @@ import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
abstract class Observable<T> {
private val listeners = mutableSetOf<ObserverListener>()
internal val listeners = mutableSetOf<ObserverListener>()
fun removeListener(render: ObserverListener) {
open fun removeListener(render: ObserverListener) {
listeners.remove(render)
}
@@ -46,15 +46,34 @@ abstract class Observable<T> {
override fun update() = callback(get())
}
listeners.add(listener)
callback(get())
return { removeListener(listener) }
}
abstract fun get(): T
fun <R> map(mapper: (T) -> R): ReadOnlyProperty<Any?, R> = Delegate(mapper(get()))
fun <R> map(mapper: (T) -> R): Observable<R> = Delegate(mapper, this)
class Delegate<T>(val value: T): ReadOnlyProperty<Any?, T> {
override fun getValue(thisRef: Any?, property: KProperty<*>): T = value
class Delegate<T, R>(val mapper: (T) -> R, val parent: Observable<T>): Observable<R>(), ReadOnlyProperty<Any?, R> {
var value: R? = null
var unsubParent = parent.listen {
val old = value
value = mapper(it)
if (old != value) {
notifyListeners()
}
}
override fun removeListener(render: ObserverListener) {
super.removeListener(render)
if (listeners.isEmpty()) {
unsubParent()
}
}
override fun get(): R = value!!
override fun getValue(thisRef: Any?, property: KProperty<*>): R = value!!
}
}