From 8723f49efde5a699ea4b55c59abbbaef97044f9f Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 22 Jul 2024 12:08:48 +0300 Subject: [PATCH] Implement MetaRef mechanics and tests --- .../space/kscience/dataforge/meta/MetaSpec.kt | 81 ------------------- 1 file changed, 81 deletions(-) delete mode 100644 dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/MetaSpec.kt diff --git a/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/MetaSpec.kt b/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/MetaSpec.kt deleted file mode 100644 index 7af7594c..00000000 --- a/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/MetaSpec.kt +++ /dev/null @@ -1,81 +0,0 @@ -package space.kscience.dataforge.meta - -import space.kscience.dataforge.meta.descriptors.Described -import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.dataforge.meta.descriptors.MetaDescriptorBuilder -import space.kscience.dataforge.misc.DFExperimental -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.asName -import kotlin.properties.PropertyDelegateProvider -import kotlin.properties.ReadOnlyProperty - - -/** - * A reference to a read-only value of type [T] inside [MetaProvider] or writable value in [MutableMetaProvider] - */ -@DFExperimental -public data class MetaRef( - public val name: Name, - public val converter: MetaConverter, - override val descriptor: MetaDescriptor? = converter.descriptor, -) : Described - -/** - * Get a value from provider by [ref] or return null if node with given name is missing - */ -@DFExperimental -public operator fun MetaProvider.get(ref: MetaRef): T? = get(ref.name)?.let { ref.converter.readOrNull(it) } - -/** - * Set a value in a mutable provider by [ref] - */ -@DFExperimental -public operator fun MutableMetaProvider.set(ref: MetaRef, value: T) { - set(ref.name, ref.converter.convert(value)) -} - -/** - * Remove a node corresponding to [ref] from a mutable provider if it exists - */ -@DFExperimental -public fun MutableMetaProvider.remove(ref: MetaRef<*>) { - remove(ref.name) -} - -/** - * A base class for [Meta] specification that stores references to meta nodes - */ -@DFExperimental -public abstract class MetaSpec : Described { - private val refs: MutableList> = mutableListOf() - - protected fun registerRef(ref: MetaRef<*>) { - refs.add(ref) - } - - public fun item( - converter: MetaConverter, - descriptor: MetaDescriptor? = converter.descriptor, - key: Name? = null, - ): PropertyDelegateProvider>> = - PropertyDelegateProvider { _, property -> - val ref = MetaRef(key ?: property.name.asName(), converter, descriptor) - registerRef(ref) - ReadOnlyProperty { _, _ -> - ref - } - } - - protected open fun MetaDescriptorBuilder.buildDescriptor(): Unit = Unit - - override val descriptor: MetaDescriptor by lazy { - MetaDescriptor { - refs.forEach { ref -> - ref.descriptor?.let { - node(ref.name, ref.descriptor) - } - } - buildDescriptor() - } - } -} \ No newline at end of file