2023-06-20 19:45:21 +03:00
|
|
|
/*
|
|
|
|
* Copyright 2018-2023 KMath contributors.
|
|
|
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
|
|
|
*/
|
|
|
|
|
|
|
|
package space.kscience.attributes
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A safe builder for [Attributes]
|
2023-09-13 09:00:56 +03:00
|
|
|
*
|
|
|
|
* @param O type marker of an owner object, for which these attributes are made
|
2023-06-20 19:45:21 +03:00
|
|
|
*/
|
2023-11-11 10:19:09 +03:00
|
|
|
public class TypedAttributesBuilder<in O> internal constructor(private val map: MutableMap<Attribute<*>, Any?>) {
|
2023-08-13 19:13:39 +03:00
|
|
|
|
|
|
|
public constructor() : this(mutableMapOf())
|
2023-06-20 19:45:21 +03:00
|
|
|
|
|
|
|
@Suppress("UNCHECKED_CAST")
|
|
|
|
public operator fun <T> get(attribute: Attribute<T>): T? = map[attribute] as? T
|
|
|
|
|
|
|
|
public operator fun <V> Attribute<V>.invoke(value: V?) {
|
|
|
|
if (value == null) {
|
|
|
|
map.remove(this)
|
|
|
|
} else {
|
|
|
|
map[this] = value
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public fun from(attributes: Attributes) {
|
|
|
|
map.putAll(attributes.content)
|
|
|
|
}
|
|
|
|
|
|
|
|
public fun <V> SetAttribute<V>.add(
|
|
|
|
attrValue: V,
|
|
|
|
) {
|
|
|
|
val currentSet: Set<V> = get(this) ?: emptySet()
|
|
|
|
map[this] = currentSet + attrValue
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Remove an element from [SetAttribute]
|
|
|
|
*/
|
|
|
|
public fun <V> SetAttribute<V>.remove(
|
|
|
|
attrValue: V,
|
|
|
|
) {
|
|
|
|
val currentSet: Set<V> = get(this) ?: emptySet()
|
|
|
|
map[this] = currentSet - attrValue
|
|
|
|
}
|
|
|
|
|
|
|
|
public fun build(): Attributes = Attributes(map)
|
|
|
|
}
|
|
|
|
|
2023-09-13 09:00:56 +03:00
|
|
|
public typealias AttributesBuilder = TypedAttributesBuilder<Any?>
|
|
|
|
|
2023-06-20 19:45:21 +03:00
|
|
|
public fun AttributesBuilder(
|
|
|
|
attributes: Attributes,
|
|
|
|
): AttributesBuilder = AttributesBuilder(attributes.content.toMutableMap())
|
|
|
|
|
2023-08-13 19:13:39 +03:00
|
|
|
public inline fun Attributes(builder: AttributesBuilder.() -> Unit): Attributes =
|
|
|
|
AttributesBuilder().apply(builder).build()
|