Add convertable and serializable extensions to Meta delegates
This commit is contained in:
parent
f7dec52438
commit
f9e7d0098f
@ -5,10 +5,12 @@
|
||||
### Added
|
||||
- Wasm artifacts
|
||||
- Add automatic MetaConverter for serializeable objects
|
||||
- Add Meta and MutableMeta delegates for convertable and serializeable
|
||||
|
||||
### Changed
|
||||
|
||||
### Deprecated
|
||||
- `node(key,converter)` in favor of `serializable` delegate
|
||||
|
||||
### Removed
|
||||
|
||||
|
@ -1,6 +1,8 @@
|
||||
package space.kscience.dataforge.meta
|
||||
|
||||
import space.kscience.dataforge.meta.descriptors.MetaDescriptor
|
||||
import space.kscience.dataforge.meta.transformations.MetaConverter
|
||||
import space.kscience.dataforge.misc.DFExperimental
|
||||
import space.kscience.dataforge.names.Name
|
||||
import space.kscience.dataforge.names.asName
|
||||
import kotlin.properties.ReadOnlyProperty
|
||||
@ -11,13 +13,48 @@ public fun MetaProvider.node(key: Name? = null): ReadOnlyProperty<Any?, Meta?> =
|
||||
get(key ?: property.name.asName())
|
||||
}
|
||||
|
||||
public fun <T> MetaProvider.node(
|
||||
/**
|
||||
* Use [converter] to read the Meta node
|
||||
*/
|
||||
public fun <T> MetaProvider.convertable(
|
||||
converter: MetaConverter<T>,
|
||||
key: Name? = null,
|
||||
converter: MetaConverter<T>
|
||||
): ReadOnlyProperty<Any?, T?> = ReadOnlyProperty { _, property ->
|
||||
get(key ?: property.name.asName())?.let { converter.metaToObject(it) }
|
||||
}
|
||||
|
||||
/**
|
||||
* Use object serializer to transform it to Meta and back
|
||||
*/
|
||||
@DFExperimental
|
||||
public inline fun <reified T> MetaProvider.serializable(
|
||||
descriptor: MetaDescriptor? = null,
|
||||
key: Name? = null,
|
||||
): ReadOnlyProperty<Any?, T?> = convertable(MetaConverter.serializable(descriptor), key)
|
||||
|
||||
@Deprecated("Use convertable", ReplaceWith("convertable(converter, key)"))
|
||||
public fun <T> MetaProvider.node(
|
||||
key: Name? = null,
|
||||
converter: MetaConverter<T>,
|
||||
): ReadOnlyProperty<Any?, T?> = convertable(converter, key)
|
||||
|
||||
/**
|
||||
* Use [converter] to convert a list of same name siblings meta to object
|
||||
*/
|
||||
public fun <T> Meta.listOfConvertable(
|
||||
converter: MetaConverter<T>,
|
||||
key: Name? = null,
|
||||
): ReadOnlyProperty<Any?, List<T>> = ReadOnlyProperty{_, property ->
|
||||
val name = key ?: property.name.asName()
|
||||
getIndexed(name).values.map { converter.metaToObject(it) }
|
||||
}
|
||||
|
||||
@DFExperimental
|
||||
public inline fun <reified T> Meta.listOfSerializable(
|
||||
descriptor: MetaDescriptor? = null,
|
||||
key: Name? = null,
|
||||
): ReadOnlyProperty<Any?, List<T>> = listOfConvertable(MetaConverter.serializable(descriptor), key)
|
||||
|
||||
/**
|
||||
* A property delegate that uses custom key
|
||||
*/
|
||||
@ -27,7 +64,7 @@ public fun MetaProvider.value(key: Name? = null): ReadOnlyProperty<Any?, Value?>
|
||||
|
||||
public fun <R> MetaProvider.value(
|
||||
key: Name? = null,
|
||||
reader: (Value?) -> R
|
||||
reader: (Value?) -> R,
|
||||
): ReadOnlyProperty<Any?, R> = ReadOnlyProperty { _, property ->
|
||||
reader(get(key ?: property.name.asName())?.value)
|
||||
}
|
||||
|
@ -165,7 +165,7 @@ public fun MutableMetaProvider.remove(key: String) {
|
||||
|
||||
// node setters
|
||||
|
||||
public operator fun MutableMetaProvider.set(Key: NameToken, value: Meta): Unit = set(Key.asName(), value)
|
||||
public operator fun MutableMetaProvider.set(key: NameToken, value: Meta): Unit = set(key.asName(), value)
|
||||
public operator fun MutableMetaProvider.set(key: String, value: Meta): Unit = set(Name.parse(key), value)
|
||||
|
||||
|
||||
|
@ -1,6 +1,8 @@
|
||||
package space.kscience.dataforge.meta
|
||||
|
||||
import space.kscience.dataforge.meta.descriptors.MetaDescriptor
|
||||
import space.kscience.dataforge.meta.transformations.MetaConverter
|
||||
import space.kscience.dataforge.misc.DFExperimental
|
||||
import space.kscience.dataforge.names.Name
|
||||
import space.kscience.dataforge.names.asName
|
||||
import kotlin.properties.ReadWriteProperty
|
||||
@ -20,10 +22,18 @@ public fun MutableMetaProvider.node(key: Name? = null): ReadWriteProperty<Any?,
|
||||
}
|
||||
}
|
||||
|
||||
public fun <T> MutableMetaProvider.node(key: Name? = null, converter: MetaConverter<T>): ReadWriteProperty<Any?, T?> =
|
||||
/**
|
||||
* Use [converter] to transform an object to Meta and back.
|
||||
* Note that mutation of the object does not change Meta.
|
||||
*/
|
||||
public fun <T> MutableMetaProvider.convertable(
|
||||
converter: MetaConverter<T>,
|
||||
key: Name? = null,
|
||||
): ReadWriteProperty<Any?, T?> =
|
||||
object : ReadWriteProperty<Any?, T?> {
|
||||
override fun getValue(thisRef: Any?, property: KProperty<*>): T? {
|
||||
return get(key ?: property.name.asName())?.let { converter.metaToObject(it) }
|
||||
val name = key ?: property.name.asName()
|
||||
return get(name)?.let { converter.metaToObject(it) }
|
||||
}
|
||||
|
||||
override fun setValue(thisRef: Any?, property: KProperty<*>, value: T?) {
|
||||
@ -32,6 +42,46 @@ public fun <T> MutableMetaProvider.node(key: Name? = null, converter: MetaConver
|
||||
}
|
||||
}
|
||||
|
||||
@Deprecated("Use convertable", ReplaceWith("convertable(converter, key)"))
|
||||
public fun <T> MutableMetaProvider.node(key: Name? = null, converter: MetaConverter<T>): ReadWriteProperty<Any?, T?> =
|
||||
convertable(converter, key)
|
||||
|
||||
/**
|
||||
* Use object serializer to transform it to Meta and back.
|
||||
* Note that mutation of the object does not change Meta.
|
||||
*/
|
||||
@DFExperimental
|
||||
public inline fun <reified T> MutableMetaProvider.serializable(
|
||||
descriptor: MetaDescriptor? = null,
|
||||
key: Name? = null,
|
||||
): ReadWriteProperty<Any?, T?> = convertable(MetaConverter.serializable(descriptor), key)
|
||||
|
||||
/**
|
||||
* Use [converter] to convert a list of same name siblings meta to object and back.
|
||||
* Note that mutation of the object does not change Meta.
|
||||
*/
|
||||
public fun <T> MutableMeta.listOfConvertable(
|
||||
converter: MetaConverter<T>,
|
||||
key: Name? = null,
|
||||
): ReadWriteProperty<Any?, List<T>> = object : ReadWriteProperty<Any?, List<T>> {
|
||||
override fun getValue(thisRef: Any?, property: KProperty<*>): List<T> {
|
||||
val name = key ?: property.name.asName()
|
||||
return getIndexed(name).values.map { converter.metaToObject(it) }
|
||||
}
|
||||
|
||||
override fun setValue(thisRef: Any?, property: KProperty<*>, value: List<T>) {
|
||||
val name = key ?: property.name.asName()
|
||||
setIndexed(name, value.map { converter.objectToMeta(it) })
|
||||
}
|
||||
}
|
||||
|
||||
@DFExperimental
|
||||
public inline fun <reified T> MutableMeta.listOfSerializable(
|
||||
descriptor: MetaDescriptor? = null,
|
||||
key: Name? = null,
|
||||
): ReadWriteProperty<Any?, List<T>> = listOfConvertable(MetaConverter.serializable(descriptor), key)
|
||||
|
||||
|
||||
public fun MutableMetaProvider.value(key: Name? = null): ReadWriteProperty<Any?, Value?> =
|
||||
object : ReadWriteProperty<Any?, Value?> {
|
||||
override fun getValue(thisRef: Any?, property: KProperty<*>): Value? =
|
||||
@ -45,7 +95,7 @@ public fun MutableMetaProvider.value(key: Name? = null): ReadWriteProperty<Any?,
|
||||
public fun <T> MutableMetaProvider.value(
|
||||
key: Name? = null,
|
||||
writer: (T) -> Value? = { Value.of(it) },
|
||||
reader: (Value?) -> T
|
||||
reader: (Value?) -> T,
|
||||
): ReadWriteProperty<Any?, T> = object : ReadWriteProperty<Any?, T> {
|
||||
override fun getValue(thisRef: Any?, property: KProperty<*>): T =
|
||||
reader(get(key ?: property.name.asName())?.value)
|
||||
|
Loading…
Reference in New Issue
Block a user