Change logic of AttributesBuilder. It no longer exposes the constructor

This commit is contained in:
Alexander Nozik 2024-03-27 09:18:46 +03:00
parent 3b74968f9a
commit ac851bea62
2 changed files with 17 additions and 16 deletions

View File

@ -30,14 +30,14 @@ public interface Attributes {
override fun hashCode(): Int override fun hashCode(): Int
public companion object { public companion object {
public val EMPTY: Attributes = AttributesImpl(emptyMap()) public val EMPTY: Attributes = MapAttributes(emptyMap())
public fun equals(a1: Attributes, a2: Attributes): Boolean = public fun equals(a1: Attributes, a2: Attributes): Boolean =
a1.keys == a2.keys && a1.keys.all { a1[it] == a2[it] } a1.keys == a2.keys && a1.keys.all { a1[it] == a2[it] }
} }
} }
internal class AttributesImpl(override val content: Map<out Attribute<*>, Any?>) : Attributes { internal class MapAttributes(override val content: Map<out Attribute<*>, Any?>) : Attributes {
override fun toString(): String = "Attributes(value=${content.entries})" override fun toString(): String = "Attributes(value=${content.entries})"
override fun equals(other: Any?): Boolean = other is Attributes && Attributes.equals(this, other) override fun equals(other: Any?): Boolean = other is Attributes && Attributes.equals(this, other)
override fun hashCode(): Int = content.hashCode() override fun hashCode(): Int = content.hashCode()
@ -75,7 +75,7 @@ public inline fun <reified A : FlagAttribute> Attributes.hasFlag(): Boolean =
public fun <T, A : Attribute<T>> Attributes.withAttribute( public fun <T, A : Attribute<T>> Attributes.withAttribute(
attribute: A, attribute: A,
attrValue: T, attrValue: T,
): Attributes = AttributesImpl(content + (attribute to attrValue)) ): Attributes = MapAttributes(content + (attribute to attrValue))
public fun <A : Attribute<Unit>> Attributes.withAttribute(attribute: A): Attributes = public fun <A : Attribute<Unit>> Attributes.withAttribute(attribute: A): Attributes =
withAttribute(attribute, Unit) withAttribute(attribute, Unit)
@ -83,7 +83,7 @@ public fun <A : Attribute<Unit>> Attributes.withAttribute(attribute: A): Attribu
/** /**
* Create a new [Attributes] by modifying the current one * Create a new [Attributes] by modifying the current one
*/ */
public fun <T> Attributes.modified(block: AttributesBuilder<T>.() -> Unit): Attributes = Attributes<T> { public fun <O> Attributes.modified(block: AttributesBuilder<O>.() -> Unit): Attributes = Attributes<O> {
putAll(this@modified) putAll(this@modified)
block() block()
} }
@ -91,7 +91,7 @@ public fun <T> Attributes.modified(block: AttributesBuilder<T>.() -> Unit): Attr
/** /**
* Create new [Attributes] by removing [attribute] key * Create new [Attributes] by removing [attribute] key
*/ */
public fun Attributes.withoutAttribute(attribute: Attribute<*>): Attributes = AttributesImpl(content.minus(attribute)) public fun Attributes.withoutAttribute(attribute: Attribute<*>): Attributes = MapAttributes(content.minus(attribute))
/** /**
* Add an element to a [SetAttribute] * Add an element to a [SetAttribute]
@ -101,7 +101,7 @@ public fun <T, A : SetAttribute<T>> Attributes.withAttributeElement(
attrValue: T, attrValue: T,
): Attributes { ): Attributes {
val currentSet: Set<T> = get(attribute) ?: emptySet() val currentSet: Set<T> = get(attribute) ?: emptySet()
return AttributesImpl( return MapAttributes(
content + (attribute to (currentSet + attrValue)) content + (attribute to (currentSet + attrValue))
) )
} }
@ -114,7 +114,7 @@ public fun <T, A : SetAttribute<T>> Attributes.withoutAttributeElement(
attrValue: T, attrValue: T,
): Attributes { ): Attributes {
val currentSet: Set<T> = get(attribute) ?: emptySet() val currentSet: Set<T> = get(attribute) ?: emptySet()
return AttributesImpl(content + (attribute to (currentSet - attrValue))) return MapAttributes(content + (attribute to (currentSet - attrValue)))
} }
/** /**
@ -123,13 +123,13 @@ public fun <T, A : SetAttribute<T>> Attributes.withoutAttributeElement(
public fun <T, A : Attribute<T>> Attributes( public fun <T, A : Attribute<T>> Attributes(
attribute: A, attribute: A,
attrValue: T, attrValue: T,
): Attributes = AttributesImpl(mapOf(attribute to attrValue)) ): Attributes = MapAttributes(mapOf(attribute to attrValue))
/** /**
* Create Attributes with a single [Unit] valued attribute * Create Attributes with a single [Unit] valued attribute
*/ */
public fun <A : Attribute<Unit>> Attributes( public fun <A : Attribute<Unit>> Attributes(
attribute: A, attribute: A,
): Attributes = AttributesImpl(mapOf(attribute to Unit)) ): Attributes = MapAttributes(mapOf(attribute to Unit))
public operator fun Attributes.plus(other: Attributes): Attributes = AttributesImpl(content + other.content) public operator fun Attributes.plus(other: Attributes): Attributes = MapAttributes(content + other.content)

View File

@ -6,13 +6,14 @@
package space.kscience.attributes package space.kscience.attributes
/** /**
* A safe builder for [Attributes] * A builder for [Attributes].
* The builder is not thread safe
* *
* @param O type marker of an owner object, for which these attributes are made * @param O type marker of an owner object, for which these attributes are made
*/ */
public class AttributesBuilder<out O> internal constructor( public class AttributesBuilder<out O> internal constructor() : Attributes {
private val map: MutableMap<Attribute<*>, Any?>,
) : Attributes { private val map = mutableMapOf<Attribute<*>, Any?>()
override fun toString(): String = "Attributes(value=${content.entries})" override fun toString(): String = "Attributes(value=${content.entries})"
override fun equals(other: Any?): Boolean = other is Attributes && Attributes.equals(this, other) override fun equals(other: Any?): Boolean = other is Attributes && Attributes.equals(this, other)
@ -56,7 +57,7 @@ public class AttributesBuilder<out O> internal constructor(
map[this] = currentSet - attrValue map[this] = currentSet - attrValue
} }
public fun build(): Attributes = AttributesImpl(map) public fun build(): Attributes = MapAttributes(map)
} }
/** /**
@ -64,4 +65,4 @@ public class AttributesBuilder<out O> internal constructor(
* @param O the type for which attributes are built. The type is used only during compilation phase for static extension dispatch * @param O the type for which attributes are built. The type is used only during compilation phase for static extension dispatch
*/ */
public fun <O> Attributes(builder: AttributesBuilder<O>.() -> Unit): Attributes = public fun <O> Attributes(builder: AttributesBuilder<O>.() -> Unit): Attributes =
AttributesBuilder<O>(mutableMapOf()).apply(builder).build() AttributesBuilder<O>().apply(builder).build()