Move extension functions to interface itself, add box() GetterSetter

This commit is contained in:
DBotThePony 2023-07-18 00:56:16 +07:00
parent 6a5924267a
commit 687b5c9726
Signed by: DBot
GPG Key ID: DCC23B5715498507

View File

@ -27,6 +27,35 @@ interface GetterSetter<V> : Supplier<V>, Consumer<V>, ReadWriteProperty<Any?, V>
accept(value)
}
fun asGetterOnly(): GetterSetter<V> {
val self = this
return object : GetterSetter<V> {
override fun get(): V {
return self.get()
}
override fun accept(t: V) {
}
}
}
fun watch(watch: (old: V, new: V) -> Unit): GetterSetter<V> {
val self = this
return object : GetterSetter<V> {
override fun get(): V {
return self.get()
}
override fun accept(t: V) {
val old = get()
self.accept(t)
watch.invoke(old, t)
}
}
}
companion object {
fun <V> of(getter: Supplier<V>, setter: Consumer<V>): GetterSetter<V> {
return object : GetterSetter<V> {
@ -63,6 +92,20 @@ interface GetterSetter<V> : Supplier<V>, Consumer<V>, ReadWriteProperty<Any?, V>
}
}
}
fun <V> box(value: V): GetterSetter<V> {
return object : GetterSetter<V> {
private var value = value
override fun get(): V {
return value
}
override fun accept(t: V) {
this.value = t
}
}
}
}
}
@ -84,18 +127,4 @@ fun <V> KMutableProperty0<V>.asGetterSetter(watch: ((old: V, new: V) -> Unit)? =
}
}
fun <V> GetterSetter<V>.watch(watch: (old: V, new: V) -> Unit): GetterSetter<V> {
return object : GetterSetter<V> {
override fun get(): V {
return this@watch.get()
}
override fun accept(t: V) {
val old = get()
this@watch.accept(t)
watch.invoke(old, t)
}
}
}
fun <V> KMutableProperty0<V>.asGetterOnly() = GetterSetter.of(Supplier { this.get() }, Consumer { /* do nothing */ })