diff --git a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/ConfigDelegates.kt b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/ConfigDelegates.kt index e848ec31..39a5f569 100644 --- a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/ConfigDelegates.kt +++ b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/ConfigDelegates.kt @@ -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 = MutableValueDelegate(config, key, Value.of(default)) -fun Configurable.value(default: T? = null, key: String? = null, transform: (Value?) -> T) = +fun Configurable.value(default: T? = null, key: String? = null, transform: (Value?) -> T): ReadWriteDelegateWrapper = 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 = MutableStringDelegate(config, key, default) -fun Configurable.boolean(default: Boolean? = null, key: String? = null) = +fun Configurable.boolean(default: Boolean? = null, key: String? = null): MutableBooleanDelegate = MutableBooleanDelegate(config, key, default) -fun Configurable.number(default: Number? = null, key: String? = null) = +fun Configurable.number(default: Number? = null, key: String? = null): MutableNumberDelegate = MutableNumberDelegate(config, key, default) /* Number delegates*/ @@ -111,3 +105,19 @@ fun Configurable.spec(spec: Specification, key: String? = null fun 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(emptyList(), key) { it?.list?.map { value -> value.string } ?: emptyList() } + +fun Configurable.numberList(key: String? = null): ReadWriteDelegateWrapper> = + value(emptyList(), key) { it?.list?.map { value -> value.number } ?: emptyList() } + +fun Metoid.child(key: String? = null, converter: (Meta) -> T) = ChildDelegate(meta, key, converter) + +fun Configurable.child(key: String? = null, converter: (Meta) -> T) = + MutableMorphDelegate(config, key, converter) diff --git a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/ExtraMetaDelegates.kt b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/ExtraMetaDelegates.kt deleted file mode 100644 index 6e24c6d0..00000000 --- a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/ExtraMetaDelegates.kt +++ /dev/null @@ -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 = emptyList() -) : - ReadWriteProperty> { - override fun getValue(thisRef: Any?, property: KProperty<*>): List { - return config[key ?: property.name]?.value?.list?.map { it.string } ?: default - } - - override fun setValue(thisRef: Any?, property: KProperty<*>, value: List) { - val name = key ?: property.name - config[name] = value - } -} - -fun Configurable.stringList(vararg default: String = emptyArray(), key: String? = null) = - StringListConfigDelegate(config, key, default.toList()) - - -fun Metoid.child(key: String? = null, converter: (Meta) -> T) = ChildDelegate(meta, key, converter) - -fun Configurable.child(key: String? = null, converter: (Meta) -> T) = - MutableMorphDelegate(config, key, converter) diff --git a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/Specific.kt b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/Specific.kt index 10210fb4..a89a44a1 100644 --- a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/Specific.kt +++ b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/Specific.kt @@ -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[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 { */ fun wrap(config: Config): T + //TODO replace by free wrapper fun wrap(meta: Meta): T = wrap(meta.toConfig()) } @@ -59,4 +62,4 @@ fun > S.createStyle(action: C.() -> Unit): Me fun Specific.spec( spec: Specification, key: String? = null -) = MutableMorphDelegate(config, key) { spec.wrap(it) } \ No newline at end of file +): MutableMorphDelegate = MutableMorphDelegate(config, key) { spec.wrap(it) } \ No newline at end of file