diff --git a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/ItemDelegate.kt b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/ItemDelegate.kt index 830f4a2c..2201aa8a 100644 --- a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/ItemDelegate.kt +++ b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/ItemDelegate.kt @@ -5,26 +5,47 @@ import hep.dataforge.names.Name import hep.dataforge.names.asName import hep.dataforge.values.Value import kotlin.properties.ReadOnlyProperty -import kotlin.reflect.KProperty /* Meta delegates */ -//TODO to be replaced in 1.4 by interfaces -open class ItemDelegate( - open val owner: ItemProvider, - val key: Name? = null, - open val default: MetaItem<*>? = null -) : ReadOnlyProperty?> { - override fun getValue(thisRef: Any?, property: KProperty<*>): MetaItem<*>? { - return owner.getItem(key ?: property.name.asName()) ?: default - } -} -public fun ItemProvider.item(key: Name? = null): ItemDelegate = ItemDelegate(this, key) +public typealias ItemDelegate = ReadOnlyProperty?> + +public fun ItemProvider.item(key: Name? = null): ItemDelegate = ReadOnlyProperty { _, property -> + getItem(key ?: property.name.asName()) +} //TODO add caching for sealed nodes -//Read-only delegates for Metas +/** + * Apply a converter to this delegate creating a delegate with a custom type + */ +public fun ItemDelegate.convert( + converter: MetaConverter, +): ReadOnlyProperty = ReadOnlyProperty { thisRef, property -> + this@convert.getValue(thisRef, property)?.let(converter::itemToObject) +} + +/* + * + */ +public fun ItemDelegate.convert( + converter: MetaConverter, + default: () -> R, +): ReadOnlyProperty = ReadOnlyProperty { thisRef, property -> + this@convert.getValue(thisRef, property)?.let(converter::itemToObject) ?: default() +} + +/** + * A converter with a custom reader transformation + */ +public fun ItemDelegate.convert( + reader: (MetaItem<*>?) -> R, +): ReadOnlyProperty = ReadOnlyProperty { thisRef, property -> + this@convert.getValue(thisRef, property).let(reader) +} + +/* Read-only delegates for Metas */ /** * A property delegate that uses custom key diff --git a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/MutableItemDelegate.kt b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/MutableItemDelegate.kt index 189b9e0f..cc08084c 100644 --- a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/MutableItemDelegate.kt +++ b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/MutableItemDelegate.kt @@ -12,103 +12,148 @@ import kotlin.reflect.KProperty /* Read-write delegates */ -open class MutableItemDelegate( - override val owner: MutableItemProvider, - key: Name? = null, - default: MetaItem<*>? = null -) : ItemDelegate(owner, key, default), ReadWriteProperty?> { +public typealias MutableItemDelegate = ReadWriteProperty?> + +public fun MutableItemProvider.item(key: Name? = null): MutableItemDelegate = object :MutableItemDelegate { + + override fun getValue(thisRef: Any?, property: KProperty<*>): MetaItem<*>? { + return getItem(key ?: property.name.asName()) + } override fun setValue(thisRef: Any?, property: KProperty<*>, value: MetaItem<*>?) { val name = key ?: property.name.asName() - owner.setItem(name, value) + setItem(name, value) + } + //MutableItemDelegate(this, key) +} + +/* Mutable converters */ + +/** + * A type converter for a mutable [MetaItem] delegate + */ +public fun MutableItemDelegate.convert( + converter: MetaConverter, +): ReadWriteProperty = object : ReadWriteProperty { + + override fun getValue(thisRef: Any?, property: KProperty<*>): R? = + this@convert.getValue(thisRef, property)?.let(converter::itemToObject) + + override fun setValue(thisRef: Any?, property: KProperty<*>, value: R?) { + val item = value?.let(converter::objectToMetaItem) + this@convert.setValue(thisRef, property, item) } } -fun MutableItemProvider.item(key: Name? = null): MutableItemDelegate = - MutableItemDelegate(this, key) +public fun MutableItemDelegate.convert( + converter: MetaConverter, + default: () -> R, +): ReadWriteProperty = object : ReadWriteProperty { -//Read-write delegates + override fun getValue(thisRef: Any?, property: KProperty<*>): R = + this@convert.getValue(thisRef, property)?.let(converter::itemToObject) ?: default() + + override fun setValue(thisRef: Any?, property: KProperty<*>, value: R) { + val item = value.let(converter::objectToMetaItem) + this@convert.setValue(thisRef, property, item) + } +} + +public fun MutableItemDelegate.convert( + reader: (MetaItem<*>?) -> R, + writer: (R) -> MetaItem<*>?, +): ReadWriteProperty = object : ReadWriteProperty { + + override fun getValue(thisRef: Any?, property: KProperty<*>): R = + this@convert.getValue(thisRef, property).let(reader) + + override fun setValue(thisRef: Any?, property: KProperty<*>, value: R) { + val item = value?.let(writer) + this@convert.setValue(thisRef, property, item) + } +} + +/* Read-write delegates */ /** * A property delegate that uses custom key */ -fun MutableItemProvider.value(key: Name? = null): ReadWriteProperty = +public fun MutableItemProvider.value(key: Name? = null): ReadWriteProperty = item(key).convert(MetaConverter.value) -fun MutableItemProvider.string(key: Name? = null): ReadWriteProperty = +public fun MutableItemProvider.string(key: Name? = null): ReadWriteProperty = item(key).convert(MetaConverter.string) -fun MutableItemProvider.boolean(key: Name? = null): ReadWriteProperty = +public fun MutableItemProvider.boolean(key: Name? = null): ReadWriteProperty = item(key).convert(MetaConverter.boolean) -fun MutableItemProvider.number(key: Name? = null): ReadWriteProperty = +public fun MutableItemProvider.number(key: Name? = null): ReadWriteProperty = item(key).convert(MetaConverter.number) -fun MutableItemProvider.string(default: String, key: Name? = null): ReadWriteProperty = +public fun MutableItemProvider.string(default: String, key: Name? = null): ReadWriteProperty = item(key).convert(MetaConverter.string) { default } -fun MutableItemProvider.boolean(default: Boolean, key: Name? = null): ReadWriteProperty = +public fun MutableItemProvider.boolean(default: Boolean, key: Name? = null): ReadWriteProperty = item(key).convert(MetaConverter.boolean) { default } -fun MutableItemProvider.number(default: Number, key: Name? = null): ReadWriteProperty = +public fun MutableItemProvider.number(default: Number, key: Name? = null): ReadWriteProperty = item(key).convert(MetaConverter.number) { default } -fun MutableItemProvider.value(key: Name? = null, default: () -> Value): ReadWriteProperty = +public fun MutableItemProvider.value(key: Name? = null, default: () -> Value): ReadWriteProperty = item(key).convert(MetaConverter.value, default) -fun MutableItemProvider.string(key: Name? = null, default: () -> String): ReadWriteProperty = +public fun MutableItemProvider.string(key: Name? = null, default: () -> String): ReadWriteProperty = item(key).convert(MetaConverter.string, default) -fun MutableItemProvider.boolean(key: Name? = null, default: () -> Boolean): ReadWriteProperty = +public fun MutableItemProvider.boolean(key: Name? = null, default: () -> Boolean): ReadWriteProperty = item(key).convert(MetaConverter.boolean, default) -fun MutableItemProvider.number(key: Name? = null, default: () -> Number): ReadWriteProperty = +public fun MutableItemProvider.number(key: Name? = null, default: () -> Number): ReadWriteProperty = item(key).convert(MetaConverter.number, default) -inline fun > MutableItemProvider.enum(default: E, key: Name? = null): ReadWriteProperty = +public inline fun > MutableItemProvider.enum(default: E, key: Name? = null): ReadWriteProperty = item(key).convert(MetaConverter.enum()) { default } -inline fun > M.node(key: Name? = null): ReadWriteProperty = +public inline fun > M.node(key: Name? = null): ReadWriteProperty = item(key).convert(reader = { it?.let { it.node as M } }, writer = { it?.let { MetaItem.NodeItem(it) } }) -fun Configurable.value(key: Name? = null): ReadWriteProperty = +public fun Configurable.value(key: Name? = null): ReadWriteProperty = item(key).convert(MetaConverter.value) -/* Number delegates*/ +/* Number delegates */ -fun MutableItemProvider.int(key: Name? = null): ReadWriteProperty = +public fun MutableItemProvider.int(key: Name? = null): ReadWriteProperty = item(key).convert(MetaConverter.int) -fun MutableItemProvider.double(key: Name? = null): ReadWriteProperty = +public fun MutableItemProvider.double(key: Name? = null): ReadWriteProperty = item(key).convert(MetaConverter.double) -fun MutableItemProvider.long(key: Name? = null): ReadWriteProperty = +public fun MutableItemProvider.long(key: Name? = null): ReadWriteProperty = item(key).convert(MetaConverter.long) -fun MutableItemProvider.float(key: Name? = null): ReadWriteProperty = +public fun MutableItemProvider.float(key: Name? = null): ReadWriteProperty = item(key).convert(MetaConverter.float) /* Safe number delegates*/ -fun MutableItemProvider.int(default: Int, key: Name? = null): ReadWriteProperty = +public fun MutableItemProvider.int(default: Int, key: Name? = null): ReadWriteProperty = item(key).convert(MetaConverter.int) { default } -fun MutableItemProvider.double(default: Double, key: Name? = null): ReadWriteProperty = +public fun MutableItemProvider.double(default: Double, key: Name? = null): ReadWriteProperty = item(key).convert(MetaConverter.double) { default } -fun MutableItemProvider.long(default: Long, key: Name? = null): ReadWriteProperty = +public fun MutableItemProvider.long(default: Long, key: Name? = null): ReadWriteProperty = item(key).convert(MetaConverter.long) { default } -fun MutableItemProvider.float(default: Float, key: Name? = null): ReadWriteProperty = +public fun MutableItemProvider.float(default: Float, key: Name? = null): ReadWriteProperty = item(key).convert(MetaConverter.float) { default } -/* - * Extra delegates for special cases - */ -fun MutableItemProvider.stringList( +/* Extra delegates for special cases */ + +public fun MutableItemProvider.stringList( vararg default: String, key: Name? = null ): ReadWriteProperty> = item(key).convert( @@ -116,14 +161,14 @@ fun MutableItemProvider.stringList( writer = { it.map { str -> str.asValue() }.asValue().asMetaItem() } ) -fun MutableItemProvider.stringList( +public fun MutableItemProvider.stringList( key: Name? = null ): ReadWriteProperty?> = item(key).convert( reader = { it?.stringList }, writer = { it?.map { str -> str.asValue() }?.asValue()?.asMetaItem() } ) -fun MutableItemProvider.numberList( +public fun MutableItemProvider.numberList( vararg default: Number, key: Name? = null ): ReadWriteProperty> = item(key).convert( @@ -131,10 +176,10 @@ fun MutableItemProvider.numberList( writer = { it.map { num -> num.asValue() }.asValue().asMetaItem() } ) -/** - * A special delegate for double arrays - */ -fun MutableItemProvider.doubleArray( +/* A special delegate for double arrays */ + + +public fun MutableItemProvider.doubleArray( vararg default: Double, key: Name? = null ): ReadWriteProperty =item(key).convert( @@ -142,7 +187,7 @@ fun MutableItemProvider.doubleArray( writer = { DoubleArrayValue(it).asMetaItem() } ) -fun MutableItemProvider.listValue( +public fun MutableItemProvider.listValue( key: Name? = null, writer: (T) -> Value = { Value.of(it) }, reader: (Value) -> T diff --git a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/propertyConverter.kt b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/propertyConverter.kt deleted file mode 100644 index ebe55218..00000000 --- a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/propertyConverter.kt +++ /dev/null @@ -1,83 +0,0 @@ -package hep.dataforge.meta - -import hep.dataforge.meta.transformations.MetaConverter -import kotlin.properties.ReadOnlyProperty -import kotlin.properties.ReadWriteProperty -import kotlin.reflect.KProperty - -/** - * Apply a converter to this delegate creating a delegate with a custom type - */ -fun ItemDelegate.convert( - converter: MetaConverter -): ReadOnlyProperty = object : ReadOnlyProperty { - override fun getValue(thisRef: Any?, property: KProperty<*>): R? = - this@convert.getValue(thisRef, property)?.let(converter::itemToObject) -} - -/* - * - */ -fun ItemDelegate.convert( - converter: MetaConverter, - default: () -> R -): ReadOnlyProperty = object : ReadOnlyProperty { - override fun getValue(thisRef: Any?, property: KProperty<*>): R = - this@convert.getValue(thisRef, property)?.let(converter::itemToObject) ?: default() -} - -/** - * A converter with a custom reader transformation - */ -fun ItemDelegate.convert( - reader: (MetaItem<*>?) -> R -): ReadOnlyProperty = object : ReadOnlyProperty { - override fun getValue(thisRef: Any?, property: KProperty<*>): R = - this@convert.getValue(thisRef, property).let(reader) -} - -/*Mutable converters*/ - -/** - * A type converter for a mutable [MetaItem] delegate - */ -fun MutableItemDelegate.convert( - converter: MetaConverter -): ReadWriteProperty = object : ReadWriteProperty { - - override fun getValue(thisRef: Any?, property: KProperty<*>): R? = - this@convert.getValue(thisRef, property)?.let(converter::itemToObject) - - override fun setValue(thisRef: Any?, property: KProperty<*>, value: R?) { - val item = value?.let(converter::objectToMetaItem) - this@convert.setValue(thisRef, property, item) - } -} - -fun MutableItemDelegate.convert( - converter: MetaConverter, - default: () -> R -): ReadWriteProperty = object : ReadWriteProperty { - - override fun getValue(thisRef: Any?, property: KProperty<*>): R = - this@convert.getValue(thisRef, property)?.let(converter::itemToObject) ?: default() - - override fun setValue(thisRef: Any?, property: KProperty<*>, value: R) { - val item = value.let(converter::objectToMetaItem) - this@convert.setValue(thisRef, property, item) - } -} - -fun MutableItemDelegate.convert( - reader: (MetaItem<*>?) -> R, - writer: (R) -> MetaItem<*>? -): ReadWriteProperty = object : ReadWriteProperty { - - override fun getValue(thisRef: Any?, property: KProperty<*>): R = - this@convert.getValue(thisRef, property).let(reader) - - override fun setValue(thisRef: Any?, property: KProperty<*>, value: R) { - val item = value?.let(writer) - this@convert.setValue(thisRef, property, item) - } -} diff --git a/settings.gradle.kts b/settings.gradle.kts index b0b821fc..e3c8a08e 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -18,7 +18,6 @@ pluginManagement { id("ru.mipt.npm.publish") version toolsVersion kotlin("jvm") version kotlinVersion kotlin("js") version kotlinVersion - } }