From 3099f2ff74eeebcc3b0964ded92575643e336072 Mon Sep 17 00:00:00 2001 From: Empa Date: Sun, 5 Oct 2025 14:02:08 +0200 Subject: [PATCH] fix: revert transform behaviour and add CachedTransform --- .../resourcefulconfigkt/api/Entries.kt | 42 +++++++++++++++---- .../api/builders/EntriesBuilder.kt | 3 ++ 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/common/src/main/kotlin/com/teamresourceful/resourcefulconfigkt/api/Entries.kt b/common/src/main/kotlin/com/teamresourceful/resourcefulconfigkt/api/Entries.kt index f3bef97..74a70a8 100644 --- a/common/src/main/kotlin/com/teamresourceful/resourcefulconfigkt/api/Entries.kt +++ b/common/src/main/kotlin/com/teamresourceful/resourcefulconfigkt/api/Entries.kt @@ -42,7 +42,26 @@ class TransformedEntryDelegate internal constructor( override val parent: RConfigKtEntry = this - private var value: R = to(actualParent.get()) + override var onChange: (R, R) -> Unit + get() = { p1, p2 -> actualParent.onChange(from(p1), from(p2)) } + set(value) { + actualParent.onChange = { p1, p2 -> value(to(p1), to(p2))} + } + + override fun get(): R = to(actualParent.get()) + override fun set(newValue: R) = actualParent.set(from(newValue)) + override fun reset() = actualParent.reset() +} + +class CachedTransformedEntryDelegate internal constructor( + private val actualParent: RConfigKtEntry, + private val from: (R) -> T, + private val to: (T) -> R, +) : RConfigKtEntry { + + private var cached: R = to(actualParent.get()) + + override val parent: RConfigKtEntry = this override var onChange: (R, R) -> Unit = { _, _ -> } @@ -50,16 +69,14 @@ class TransformedEntryDelegate internal constructor( val parentOnChange = actualParent.onChange actualParent.onChange = { old, new -> parentOnChange(old, new) - val oldValue = value - this.value = to(new) - if (oldValue != value) onChange(oldValue, value) + val oldValue = cached + this.cached = to(new) + if (oldValue != cached) onChange(oldValue, cached) } } - override fun get(): R = value - + override fun get(): R = cached override fun set(newValue: R) = actualParent.set(from(newValue)) - override fun reset() = actualParent.reset() } @@ -106,6 +123,17 @@ class ObservableEntry( } } +class CachedTransformedEntry( + private val entry: ConfigDelegateProvider>, + private val from: (R) -> T, + private val to: (T) -> R, +) : ConfigDelegateProvider> { + override operator fun provideDelegate(entries: EntriesBuilder, prop: KProperty<*>): CachedTransformedEntryDelegate { + val property = entry.provideDelegate(entries, prop) + return CachedTransformedEntryDelegate(property.parent, from, to) + } +} + class TransformedEntry( private val entry: ConfigDelegateProvider>, private val from: (R) -> T, diff --git a/common/src/main/kotlin/com/teamresourceful/resourcefulconfigkt/api/builders/EntriesBuilder.kt b/common/src/main/kotlin/com/teamresourceful/resourcefulconfigkt/api/builders/EntriesBuilder.kt index 8d2b631..bcd9060 100644 --- a/common/src/main/kotlin/com/teamresourceful/resourcefulconfigkt/api/builders/EntriesBuilder.kt +++ b/common/src/main/kotlin/com/teamresourceful/resourcefulconfigkt/api/builders/EntriesBuilder.kt @@ -4,6 +4,7 @@ import com.teamresourceful.resourcefulconfig.api.types.ResourcefulConfigElement import com.teamresourceful.resourcefulconfig.api.types.elements.ResourcefulConfigEntryElement import com.teamresourceful.resourcefulconfig.api.types.options.EntryType import com.teamresourceful.resourcefulconfig.api.types.options.TranslatableValue +import com.teamresourceful.resourcefulconfigkt.api.CachedTransformedEntry import com.teamresourceful.resourcefulconfigkt.api.ConfigDelegateProvider import com.teamresourceful.resourcefulconfigkt.api.Entry import com.teamresourceful.resourcefulconfigkt.api.RConfigKtEntry @@ -99,6 +100,8 @@ open class EntriesBuilder { fun observable(entry: ConfigDelegateProvider>, onChange: (T, T) -> Unit) = ObservableEntry(entry, onChange) fun transform(entry: Entry, from: (R) -> T, to: (T) -> R) = TransformedEntry(entry, from, to) fun transform(entry: ConfigDelegateProvider>, from: (R) -> T, to: (T) -> R) = TransformedEntry(entry, from, to) + fun cachedTransform(entry: Entry, from: (R) -> T, to: (T) -> R) = CachedTransformedEntry(entry, from, to) + fun cachedTransform(entry: ConfigDelegateProvider>, from: (R) -> T, to: (T) -> R) = CachedTransformedEntry(entry, from, to) companion object {