Implement ReadWriteProperty in GetterSetter

This commit is contained in:
DBotThePony 2023-01-29 00:12:32 +07:00
parent 4c78e4e6c6
commit d49ec98d71
Signed by: DBot
GPG Key ID: DCC23B5715498507
2 changed files with 15 additions and 20 deletions

View File

@ -2,6 +2,7 @@ package ru.dbotthepony.mc.otm.core
import java.util.function.Consumer import java.util.function.Consumer
import java.util.function.Supplier import java.util.function.Supplier
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KMutableProperty0 import kotlin.reflect.KMutableProperty0
import kotlin.reflect.KProperty import kotlin.reflect.KProperty
@ -9,17 +10,15 @@ inline var <V> GetterSetter<V>.value: V
get() = get() get() = get()
set(value) { accept(value) } set(value) { accept(value) }
@Suppress("nothing_to_inline") interface GetterSetter<V> : Supplier<V>, Consumer<V>, ReadWriteProperty<Any?, V> {
inline operator fun <V> GetterSetter<V>.getValue(thisRef: Any, property: KProperty<*>): V { override fun setValue(thisRef: Any?, property: KProperty<*>, value: V) {
return get() accept(value)
} }
@Suppress("nothing_to_inline") override fun getValue(thisRef: Any?, property: KProperty<*>): V {
inline operator fun <V> GetterSetter<V>.setValue(thisRef: Any, property: KProperty<*>, value: V) { return get()
accept(value) }
}
interface GetterSetter<V> : Supplier<V>, Consumer<V> {
companion object { companion object {
fun <V> of(getter: Supplier<V>, setter: Consumer<V>): GetterSetter<V> { fun <V> of(getter: Supplier<V>, setter: Consumer<V>): GetterSetter<V> {
return object : GetterSetter<V> { return object : GetterSetter<V> {

View File

@ -62,7 +62,7 @@ fun interface FieldSetter<V> {
fun invoke(value: V, access: FieldAccess<V>, setByRemote: Boolean) fun invoke(value: V, access: FieldAccess<V>, setByRemote: Boolean)
} }
sealed interface IField<V> : ReadOnlyProperty<Any, V>, Supplier<V>, () -> V { sealed interface IField<V> : ReadOnlyProperty<Any?, V>, Supplier<V>, () -> V {
fun observe(): Boolean fun observe(): Boolean
fun markDirty() fun markDirty()
fun markDirty(endpoint: FieldSynchronizer.Endpoint) fun markDirty(endpoint: FieldSynchronizer.Endpoint)
@ -76,7 +76,7 @@ sealed interface IField<V> : ReadOnlyProperty<Any, V>, Supplier<V>, () -> V {
fun read(stream: DataInputStream) fun read(stream: DataInputStream)
override fun getValue(thisRef: Any, property: KProperty<*>): V { override fun getValue(thisRef: Any?, property: KProperty<*>): V {
return this.value return this.value
} }
@ -89,20 +89,16 @@ sealed interface IField<V> : ReadOnlyProperty<Any, V>, Supplier<V>, () -> V {
} }
} }
sealed interface IMutableField<V> : IField<V>, ReadWriteProperty<Any, V>, GetterSetter<V> { sealed interface IMutableField<V> : IField<V>, GetterSetter<V> {
override var value: V override fun getValue(thisRef: Any?, property: KProperty<*>): V {
return this.value
override fun setValue(thisRef: Any, property: KProperty<*>, value: V) {
this.value = value
} }
override var value: V
override fun accept(t: V) { override fun accept(t: V) {
value = t value = t
} }
override fun getValue(thisRef: Any, property: KProperty<*>): V {
return super.getValue(thisRef, property)
}
} }
data class MapChangeset<out K, out V>( data class MapChangeset<out K, out V>(