@@ -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+
109137class TransformedEntry <T , R >(
110138 private val entry : ConfigDelegateProvider <RConfigKtEntry <T >>,
111139 private val from : (R ) -> T ,
0 commit comments