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
|
||||
*/
|
||||
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))
|
||||
|
||||
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)
|
||||
|
||||
fun Configurable.stringList(key: String? = null) =
|
||||
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) =
|
||||
fun Configurable.string(default: String? = null, key: String? = null): MutableStringDelegate<Config> =
|
||||
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)
|
||||
|
||||
fun Configurable.number(default: Number? = null, key: String? = null) =
|
||||
fun Configurable.number(default: Number? = null, key: String? = null): MutableNumberDelegate<Config> =
|
||||
MutableNumberDelegate(config, key, default)
|
||||
|
||||
/* 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) =
|
||||
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
|
||||
|
||||
/**
|
||||
* Marker interface for specifications
|
||||
* Marker interface for classes with specifications
|
||||
*/
|
||||
interface Specific : Configurable {
|
||||
operator fun get(name: String): MetaItem<Config>? = config[name]
|
||||
}
|
||||
interface Specific : Configurable
|
||||
|
||||
//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.
|
||||
@ -29,6 +31,7 @@ interface Specification<T : Specific> {
|
||||
*/
|
||||
fun wrap(config: Config): T
|
||||
|
||||
//TODO replace by free wrapper
|
||||
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(
|
||||
spec: Specification<C>,
|
||||
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