use super::tensor::TensorValue;
#[derive(Debug, Clone)]
pub enum Value {
U32(u32),
I32(i32),
U64(u64),
Bool(bool),
Bytes(Vec<u8>),
Float(f64),
Tensor(TensorValue),
Array(Vec<Value>),
}
impl PartialEq for Value {
fn eq(&self, other: &Self) -> bool {
match (self, other) {
(Self::U32(a), Self::U32(b)) => a == b,
(Self::I32(a), Self::I32(b)) => a == b,
(Self::U64(a), Self::U64(b)) => a == b,
(Self::Bool(a), Self::Bool(b)) => a == b,
(Self::Bytes(a), Self::Bytes(b)) => a == b,
(Self::Float(a), Self::Float(b)) => a.to_bits() == b.to_bits(),
(Self::Tensor(a), Self::Tensor(b)) => a == b,
(Self::Array(a), Self::Array(b)) => a == b,
_ => false,
}
}
}
impl Eq for Value {}
impl Value {
#[must_use]
pub fn to_reference_value(&self) -> vyre_reference::value::Value {
match self {
Self::U32(value) => vyre_reference::value::Value::U32(*value),
Self::I32(value) => vyre_reference::value::Value::I32(*value),
Self::U64(value) => vyre_reference::value::Value::U64(*value),
Self::Bool(value) => vyre_reference::value::Value::Bool(*value),
Self::Bytes(bytes) => vyre_reference::value::Value::Bytes(bytes.clone()),
Self::Float(value) => vyre_reference::value::Value::Float(*value),
Self::Tensor(tensor) => vyre_reference::value::Value::Bytes(tensor.data.clone()),
Self::Array(values) => vyre_reference::value::Value::Array(
values.iter().map(Self::to_reference_value).collect(),
),
}
}
#[must_use]
pub fn from_reference_value(value: vyre_reference::value::Value) -> Self {
match value {
vyre_reference::value::Value::U32(value) => Self::U32(value),
vyre_reference::value::Value::I32(value) => Self::I32(value),
vyre_reference::value::Value::U64(value) => Self::U64(value),
vyre_reference::value::Value::Bool(value) => Self::Bool(value),
vyre_reference::value::Value::Bytes(bytes) => Self::Bytes(bytes),
vyre_reference::value::Value::Float(value) => Self::Float(value),
vyre_reference::value::Value::Array(values) => {
Self::Array(values.into_iter().map(Self::from_reference_value).collect())
}
other => Self::Bytes(other.to_bytes()),
}
}
#[must_use]
pub fn to_reference_values(values: &[Self]) -> Vec<vyre_reference::value::Value> {
values.iter().map(Self::to_reference_value).collect()
}
#[must_use]
pub fn from_reference_values(values: Vec<vyre_reference::value::Value>) -> Vec<Self> {
values.into_iter().map(Self::from_reference_value).collect()
}
}