forked from SteamWar/SteamWar
@@ -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!!
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user