forked from SteamWar/SteamWar
@@ -24,9 +24,9 @@ import kotlin.properties.ReadWriteProperty
|
|||||||
import kotlin.reflect.KProperty
|
import kotlin.reflect.KProperty
|
||||||
|
|
||||||
abstract class Observable<T> {
|
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)
|
listeners.remove(render)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,15 +46,34 @@ abstract class Observable<T> {
|
|||||||
override fun update() = callback(get())
|
override fun update() = callback(get())
|
||||||
}
|
}
|
||||||
listeners.add(listener)
|
listeners.add(listener)
|
||||||
|
callback(get())
|
||||||
return { removeListener(listener) }
|
return { removeListener(listener) }
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract fun get(): T
|
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> {
|
class Delegate<T, R>(val mapper: (T) -> R, val parent: Observable<T>): Observable<R>(), ReadOnlyProperty<Any?, R> {
|
||||||
override fun getValue(thisRef: Any?, property: KProperty<*>): T = value
|
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!!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user