Skip to content

Commit 3099f2f

Browse files
committed
fix: revert transform behaviour and add CachedTransform
1 parent 81381d7 commit 3099f2f

File tree

2 files changed

+38
-7
lines changed

2 files changed

+38
-7
lines changed

common/src/main/kotlin/com/teamresourceful/resourcefulconfigkt/api/Entries.kt

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,24 +42,41 @@ class TransformedEntryDelegate<T, R> internal constructor(
4242

4343
override val parent: RConfigKtEntry<R> = this
4444

45-
private var value: R = to(actualParent.get())
45+
override var onChange: (R, R) -> Unit
46+
get() = { p1, p2 -> actualParent.onChange(from(p1), from(p2)) }
47+
set(value) {
48+
actualParent.onChange = { p1, p2 -> value(to(p1), to(p2))}
49+
}
50+
51+
override fun get(): R = to(actualParent.get())
52+
override fun set(newValue: R) = actualParent.set(from(newValue))
53+
override fun reset() = actualParent.reset()
54+
}
55+
56+
class CachedTransformedEntryDelegate<T, R> internal constructor(
57+
private val actualParent: RConfigKtEntry<T>,
58+
private val from: (R) -> T,
59+
private val to: (T) -> R,
60+
) : RConfigKtEntry<R> {
61+
62+
private var cached: R = to(actualParent.get())
63+
64+
override val parent: RConfigKtEntry<R> = this
4665

4766
override var onChange: (R, R) -> Unit = { _, _ -> }
4867

4968
init {
5069
val parentOnChange = actualParent.onChange
5170
actualParent.onChange = { old, new ->
5271
parentOnChange(old, new)
53-
val oldValue = value
54-
this.value = to(new)
55-
if (oldValue != value) onChange(oldValue, value)
72+
val oldValue = cached
73+
this.cached = to(new)
74+
if (oldValue != cached) onChange(oldValue, cached)
5675
}
5776
}
5877

59-
override fun get(): R = value
60-
78+
override fun get(): R = cached
6179
override fun set(newValue: R) = actualParent.set(from(newValue))
62-
6380
override fun reset() = actualParent.reset()
6481
}
6582

@@ -106,6 +123,17 @@ class ObservableEntry<T>(
106123
}
107124
}
108125

126+
class CachedTransformedEntry<T, R>(
127+
private val entry: ConfigDelegateProvider<RConfigKtEntry<T>>,
128+
private val from: (R) -> T,
129+
private val to: (T) -> R,
130+
) : ConfigDelegateProvider<RConfigKtEntry<R>> {
131+
override operator fun provideDelegate(entries: EntriesBuilder, prop: KProperty<*>): CachedTransformedEntryDelegate<T, R> {
132+
val property = entry.provideDelegate(entries, prop)
133+
return CachedTransformedEntryDelegate(property.parent, from, to)
134+
}
135+
}
136+
109137
class TransformedEntry<T, R>(
110138
private val entry: ConfigDelegateProvider<RConfigKtEntry<T>>,
111139
private val from: (R) -> T,

common/src/main/kotlin/com/teamresourceful/resourcefulconfigkt/api/builders/EntriesBuilder.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.teamresourceful.resourcefulconfig.api.types.ResourcefulConfigElement
44
import com.teamresourceful.resourcefulconfig.api.types.elements.ResourcefulConfigEntryElement
55
import com.teamresourceful.resourcefulconfig.api.types.options.EntryType
66
import com.teamresourceful.resourcefulconfig.api.types.options.TranslatableValue
7+
import com.teamresourceful.resourcefulconfigkt.api.CachedTransformedEntry
78
import com.teamresourceful.resourcefulconfigkt.api.ConfigDelegateProvider
89
import com.teamresourceful.resourcefulconfigkt.api.Entry
910
import com.teamresourceful.resourcefulconfigkt.api.RConfigKtEntry
@@ -99,6 +100,8 @@ open class EntriesBuilder {
99100
fun <T> observable(entry: ConfigDelegateProvider<RConfigKtEntry<T>>, onChange: (T, T) -> Unit) = ObservableEntry(entry, onChange)
100101
fun <T, R> transform(entry: Entry<T, *>, from: (R) -> T, to: (T) -> R) = TransformedEntry(entry, from, to)
101102
fun <T, R> transform(entry: ConfigDelegateProvider<RConfigKtEntry<T>>, from: (R) -> T, to: (T) -> R) = TransformedEntry(entry, from, to)
103+
fun <T, R> cachedTransform(entry: Entry<T, *>, from: (R) -> T, to: (T) -> R) = CachedTransformedEntry(entry, from, to)
104+
fun <T, R> cachedTransform(entry: ConfigDelegateProvider<RConfigKtEntry<T>>, from: (R) -> T, to: (T) -> R) = CachedTransformedEntry(entry, from, to)
102105

103106
companion object {
104107

0 commit comments

Comments
 (0)