Value extensions to access primitives
This commit is contained in:
parent
337401f6e0
commit
1b118986f5
@ -263,6 +263,4 @@ interface Metoid {
|
|||||||
val meta: Meta
|
val meta: Meta
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Value.toMeta() = buildMeta { Meta.VALUE_KEY to this }
|
|
||||||
|
|
||||||
fun Meta.isEmpty() = this === EmptyMeta || this.items.isEmpty()
|
fun Meta.isEmpty() = this === EmptyMeta || this.items.isEmpty()
|
||||||
|
@ -139,7 +139,7 @@ fun String.toName(): Name {
|
|||||||
* Convert the [String] to a [Name] by simply wrapping it in a single name token without parsing.
|
* Convert the [String] to a [Name] by simply wrapping it in a single name token without parsing.
|
||||||
* The input string could contain dots and braces, but they are just escaped, not parsed.
|
* The input string could contain dots and braces, but they are just escaped, not parsed.
|
||||||
*/
|
*/
|
||||||
fun String.asName(): Name = if(isBlank()) EmptyName else NameToken(this).asName()
|
fun String.asName(): Name = if (isBlank()) EmptyName else NameToken(this).asName()
|
||||||
|
|
||||||
operator fun NameToken.plus(other: Name): Name = Name(listOf(this) + other.tokens)
|
operator fun NameToken.plus(other: Name): Name = Name(listOf(this) + other.tokens)
|
||||||
|
|
||||||
@ -147,6 +147,8 @@ operator fun Name.plus(other: Name): Name = Name(this.tokens + other.tokens)
|
|||||||
|
|
||||||
operator fun Name.plus(other: String): Name = this + other.toName()
|
operator fun Name.plus(other: String): Name = this + other.toName()
|
||||||
|
|
||||||
|
operator fun Name.plus(other: NameToken): Name = Name(tokens + other)
|
||||||
|
|
||||||
fun Name.appendLeft(other: String): Name = NameToken(other) + this
|
fun Name.appendLeft(other: String): Name = NameToken(other) + this
|
||||||
|
|
||||||
fun NameToken.asName() = Name(listOf(this))
|
fun NameToken.asName() = Name(listOf(this))
|
||||||
|
@ -45,6 +45,8 @@ interface Value {
|
|||||||
|
|
||||||
override fun equals(other: Any?): Boolean
|
override fun equals(other: Any?): Boolean
|
||||||
|
|
||||||
|
override fun hashCode(): Int
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val TYPE = "value"
|
const val TYPE = "value"
|
||||||
|
|
||||||
@ -86,14 +88,9 @@ object Null : Value {
|
|||||||
override fun toString(): String = value.toString()
|
override fun toString(): String = value.toString()
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean = other === Null
|
override fun equals(other: Any?): Boolean = other === Null
|
||||||
|
override fun hashCode(): Int = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if value is null
|
|
||||||
*/
|
|
||||||
fun Value.isNull(): Boolean = this == Null
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Singleton true value
|
* Singleton true value
|
||||||
*/
|
*/
|
||||||
@ -106,7 +103,7 @@ object True : Value {
|
|||||||
override fun toString(): String = value.toString()
|
override fun toString(): String = value.toString()
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean = other === True
|
override fun equals(other: Any?): Boolean = other === True
|
||||||
|
override fun hashCode(): Int = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -121,10 +118,9 @@ object False : Value {
|
|||||||
override fun toString(): String = True.value.toString()
|
override fun toString(): String = True.value.toString()
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean = other === False
|
override fun equals(other: Any?): Boolean = other === False
|
||||||
|
override fun hashCode(): Int = -1
|
||||||
}
|
}
|
||||||
|
|
||||||
val Value.boolean get() = this == True || this.list.firstOrNull() == True || (type == ValueType.STRING && string.toBoolean())
|
|
||||||
|
|
||||||
class NumberValue(override val number: Number) : Value {
|
class NumberValue(override val number: Number) : Value {
|
||||||
override val value: Any? get() = number
|
override val value: Any? get() = number
|
||||||
override val type: ValueType get() = ValueType.NUMBER
|
override val type: ValueType get() = ValueType.NUMBER
|
||||||
@ -183,18 +179,18 @@ class ListValue(override val list: List<Value>) : Value {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override val value: Any? get() = list
|
override val value: List<Value> get() = list
|
||||||
override val type: ValueType get() = list.first().type
|
override val type: ValueType get() = list.first().type
|
||||||
override val number: Number get() = list.first().number
|
override val number: Number get() = list.first().number
|
||||||
override val string: String get() = list.first().string
|
override val string: String get() = list.first().string
|
||||||
|
|
||||||
override fun toString(): String = list.joinToString (prefix = "[", postfix = "]")
|
override fun toString(): String = list.joinToString(prefix = "[", postfix = "]")
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
if (this === other) return true
|
if (this === other) return true
|
||||||
if (other !is Value) return false
|
if (other !is Value) return false
|
||||||
if( other is DoubleArrayValue){
|
if (other is DoubleArrayValue) {
|
||||||
|
return DoubleArray(list.size) { list[it].number.toDouble() }.contentEquals(other.value)
|
||||||
}
|
}
|
||||||
return list == other.list
|
return list == other.list
|
||||||
}
|
}
|
||||||
@ -206,12 +202,6 @@ class ListValue(override val list: List<Value>) : Value {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if value is list
|
|
||||||
*/
|
|
||||||
fun Value.isList(): Boolean = this.list.size > 1
|
|
||||||
|
|
||||||
|
|
||||||
fun Number.asValue(): Value = NumberValue(this)
|
fun Number.asValue(): Value = NumberValue(this)
|
||||||
|
|
||||||
fun Boolean.asValue(): Value = if (this) True else False
|
fun Boolean.asValue(): Value = if (this) True else False
|
||||||
@ -220,15 +210,15 @@ fun String.asValue(): Value = StringValue(this)
|
|||||||
|
|
||||||
fun Iterable<Value>.asValue(): Value = ListValue(this.toList())
|
fun Iterable<Value>.asValue(): Value = ListValue(this.toList())
|
||||||
|
|
||||||
fun IntArray.asValue(): Value = ListValue(map{NumberValue(it)})
|
fun IntArray.asValue(): Value = ListValue(map { NumberValue(it) })
|
||||||
|
|
||||||
fun LongArray.asValue(): Value = ListValue(map{NumberValue(it)})
|
fun LongArray.asValue(): Value = ListValue(map { NumberValue(it) })
|
||||||
|
|
||||||
fun ShortArray.asValue(): Value = ListValue(map{NumberValue(it)})
|
fun ShortArray.asValue(): Value = ListValue(map { NumberValue(it) })
|
||||||
|
|
||||||
fun FloatArray.asValue(): Value = ListValue(map{NumberValue(it)})
|
fun FloatArray.asValue(): Value = ListValue(map { NumberValue(it) })
|
||||||
|
|
||||||
fun ByteArray.asValue(): Value = ListValue(map{NumberValue(it)})
|
fun ByteArray.asValue(): Value = ListValue(map { NumberValue(it) })
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
package hep.dataforge.values
|
||||||
|
|
||||||
|
import hep.dataforge.meta.Meta
|
||||||
|
import hep.dataforge.meta.buildMeta
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if value is null
|
||||||
|
*/
|
||||||
|
fun Value.isNull(): Boolean = this == Null
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if value is list
|
||||||
|
*/
|
||||||
|
fun Value.isList(): Boolean = this.list.size > 1
|
||||||
|
|
||||||
|
val Value.boolean
|
||||||
|
get() = this == True
|
||||||
|
|| this.list.firstOrNull() == True
|
||||||
|
|| (type == ValueType.STRING && string.toBoolean())
|
||||||
|
|
||||||
|
|
||||||
|
val Value.int get() = number.toInt()
|
||||||
|
val Value.double get() = number.toDouble()
|
||||||
|
val Value.float get() = number.toFloat()
|
||||||
|
val Value.long get() = number.toLong()
|
||||||
|
|
||||||
|
val Value.stringList: List<String> get() = list.map { it.string }
|
||||||
|
|
||||||
|
val Value.doubleArray: DoubleArray
|
||||||
|
get() = if (this is DoubleArrayValue) {
|
||||||
|
value
|
||||||
|
} else {
|
||||||
|
DoubleArray(list.size) { list[it].double }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun Value.toMeta() = buildMeta { Meta.VALUE_KEY to this }
|
Loading…
Reference in New Issue
Block a user