Minor delegates optimization
This commit is contained in:
parent
fdd5b11370
commit
f1692297b8
@ -10,25 +10,19 @@ import kotlin.jvm.JvmName
|
|||||||
/**
|
/**
|
||||||
* A property delegate that uses custom key
|
* A property delegate that uses custom key
|
||||||
*/
|
*/
|
||||||
fun Configurable.value(default: Any = Null, key: String? = null) =
|
fun Configurable.value(default: Any = Null, key: String? = null): MutableValueDelegate<Config> =
|
||||||
MutableValueDelegate(config, key, Value.of(default))
|
MutableValueDelegate(config, key, Value.of(default))
|
||||||
|
|
||||||
fun <T> Configurable.value(default: T? = null, key: String? = null, transform: (Value?) -> T) =
|
fun <T> Configurable.value(default: T? = null, key: String? = null, transform: (Value?) -> T): ReadWriteDelegateWrapper<Value?, T> =
|
||||||
MutableValueDelegate(config, key, Value.of(default)).transform(reader = transform)
|
MutableValueDelegate(config, key, Value.of(default)).transform(reader = transform)
|
||||||
|
|
||||||
fun Configurable.stringList(key: String? = null) =
|
fun Configurable.string(default: String? = null, key: String? = null): MutableStringDelegate<Config> =
|
||||||
value(key) { it?.list?.map { value -> value.string } ?: emptyList() }
|
|
||||||
|
|
||||||
fun Configurable.numberList(key: String? = null) =
|
|
||||||
value(key) { it?.list?.map { value -> value.number } ?: emptyList() }
|
|
||||||
|
|
||||||
fun Configurable.string(default: String? = null, key: String? = null) =
|
|
||||||
MutableStringDelegate(config, key, default)
|
MutableStringDelegate(config, key, default)
|
||||||
|
|
||||||
fun Configurable.boolean(default: Boolean? = null, key: String? = null) =
|
fun Configurable.boolean(default: Boolean? = null, key: String? = null): MutableBooleanDelegate<Config> =
|
||||||
MutableBooleanDelegate(config, key, default)
|
MutableBooleanDelegate(config, key, default)
|
||||||
|
|
||||||
fun Configurable.number(default: Number? = null, key: String? = null) =
|
fun Configurable.number(default: Number? = null, key: String? = null): MutableNumberDelegate<Config> =
|
||||||
MutableNumberDelegate(config, key, default)
|
MutableNumberDelegate(config, key, default)
|
||||||
|
|
||||||
/* Number delegates*/
|
/* Number delegates*/
|
||||||
@ -111,3 +105,19 @@ fun <T : Specific> Configurable.spec(spec: Specification<T>, key: String? = null
|
|||||||
|
|
||||||
fun <T : Specific> Configurable.spec(builder: (Config) -> T, key: String? = null) =
|
fun <T : Specific> Configurable.spec(builder: (Config) -> T, key: String? = null) =
|
||||||
MutableMorphDelegate(config, key) { specification(builder).wrap(it) }
|
MutableMorphDelegate(config, key) { specification(builder).wrap(it) }
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Extra delegates for special cases
|
||||||
|
*/
|
||||||
|
|
||||||
|
fun Configurable.stringList(key: String? = null): ReadWriteDelegateWrapper<Value?, List<String>> =
|
||||||
|
value(emptyList(), key) { it?.list?.map { value -> value.string } ?: emptyList() }
|
||||||
|
|
||||||
|
fun Configurable.numberList(key: String? = null): ReadWriteDelegateWrapper<Value?, List<Number>> =
|
||||||
|
value(emptyList(), key) { it?.list?.map { value -> value.number } ?: emptyList() }
|
||||||
|
|
||||||
|
fun <T : Metoid> Metoid.child(key: String? = null, converter: (Meta) -> T) = ChildDelegate(meta, key, converter)
|
||||||
|
|
||||||
|
fun <T : Configurable> Configurable.child(key: String? = null, converter: (Meta) -> T) =
|
||||||
|
MutableMorphDelegate(config, key, converter)
|
||||||
|
@ -1,36 +0,0 @@
|
|||||||
package hep.dataforge.meta
|
|
||||||
|
|
||||||
import kotlin.properties.ReadWriteProperty
|
|
||||||
import kotlin.reflect.KProperty
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Extra delegates for special cases
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A delegate for a string list
|
|
||||||
*/
|
|
||||||
class StringListConfigDelegate(
|
|
||||||
val config: Config,
|
|
||||||
private val key: String? = null,
|
|
||||||
private val default: List<String> = emptyList()
|
|
||||||
) :
|
|
||||||
ReadWriteProperty<Any?, List<String>> {
|
|
||||||
override fun getValue(thisRef: Any?, property: KProperty<*>): List<String> {
|
|
||||||
return config[key ?: property.name]?.value?.list?.map { it.string } ?: default
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun setValue(thisRef: Any?, property: KProperty<*>, value: List<String>) {
|
|
||||||
val name = key ?: property.name
|
|
||||||
config[name] = value
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun Configurable.stringList(vararg default: String = emptyArray(), key: String? = null) =
|
|
||||||
StringListConfigDelegate(config, key, default.toList())
|
|
||||||
|
|
||||||
|
|
||||||
fun <T : Metoid> Metoid.child(key: String? = null, converter: (Meta) -> T) = ChildDelegate(meta, key, converter)
|
|
||||||
|
|
||||||
fun <T : Configurable> Configurable.child(key: String? = null, converter: (Meta) -> T) =
|
|
||||||
MutableMorphDelegate(config, key, converter)
|
|
@ -1,11 +1,13 @@
|
|||||||
package hep.dataforge.meta
|
package hep.dataforge.meta
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Marker interface for specifications
|
* Marker interface for classes with specifications
|
||||||
*/
|
*/
|
||||||
interface Specific : Configurable {
|
interface Specific : Configurable
|
||||||
operator fun get(name: String): MetaItem<Config>? = config[name]
|
|
||||||
}
|
//TODO separate mutable config from immutable meta to allow free wrapping of meta
|
||||||
|
|
||||||
|
operator fun Specific.get(name: String): MetaItem<*>? = config[name]
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allows to apply custom configuration in a type safe way to simple untyped configuration.
|
* Allows to apply custom configuration in a type safe way to simple untyped configuration.
|
||||||
@ -29,6 +31,7 @@ interface Specification<T : Specific> {
|
|||||||
*/
|
*/
|
||||||
fun wrap(config: Config): T
|
fun wrap(config: Config): T
|
||||||
|
|
||||||
|
//TODO replace by free wrapper
|
||||||
fun wrap(meta: Meta): T = wrap(meta.toConfig())
|
fun wrap(meta: Meta): T = wrap(meta.toConfig())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -59,4 +62,4 @@ fun <C : Specific, S : Specification<C>> S.createStyle(action: C.() -> Unit): Me
|
|||||||
fun <C : Specific> Specific.spec(
|
fun <C : Specific> Specific.spec(
|
||||||
spec: Specification<C>,
|
spec: Specification<C>,
|
||||||
key: String? = null
|
key: String? = null
|
||||||
) = MutableMorphDelegate(config, key) { spec.wrap(it) }
|
): MutableMorphDelegate<Config, C> = MutableMorphDelegate(config, key) { spec.wrap(it) }
|
Loading…
Reference in New Issue
Block a user