use super::*;
mod display;
#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)]
pub enum ValkyrieOperator {
Not,
Positive,
Negative,
Unbox,
Unpack,
UnpackAll,
Inverse,
Surd(u8),
Plus,
Concat,
Greater,
Less,
MuchGreater,
MuchLess,
VeryMuchGreater,
VeryMuchLess,
Equal(bool),
StrictlyEqual(bool),
Belongs(bool),
IsA(bool),
Minus,
Multiply,
Divide,
Power,
Unwrap,
Raise,
Celsius,
Fahrenheit,
DivideByDecimalPower(u8),
Transpose,
Transjugate,
Hermitian,
}
impl ValkyrieOperator {
pub fn precedence(&self) -> u32 {
match self {
ValkyrieOperator::Concat => 14000,
ValkyrieOperator::Belongs(_) => 14000,
ValkyrieOperator::IsA(_) => 14000,
ValkyrieOperator::Equal(_) => 14700,
ValkyrieOperator::StrictlyEqual(_) => 14700,
ValkyrieOperator::Greater => 14800,
ValkyrieOperator::Less => 14800,
ValkyrieOperator::MuchLess => 14900,
ValkyrieOperator::MuchGreater => 14900,
ValkyrieOperator::VeryMuchGreater => 14950,
ValkyrieOperator::VeryMuchLess => 14950,
ValkyrieOperator::Plus => 15000,
ValkyrieOperator::Minus => 15000,
ValkyrieOperator::Multiply => 15100,
ValkyrieOperator::Divide => 15100,
ValkyrieOperator::Power => 15200,
ValkyrieOperator::Not => 25000,
ValkyrieOperator::Positive => 25000,
ValkyrieOperator::Negative => 25000,
ValkyrieOperator::Unbox => 25000,
ValkyrieOperator::Unpack => 25000,
ValkyrieOperator::UnpackAll => 25000,
ValkyrieOperator::Inverse => 25000,
ValkyrieOperator::Surd(_) => 25000,
ValkyrieOperator::Unwrap => 45000,
ValkyrieOperator::Raise => 45000,
ValkyrieOperator::Celsius => 45000,
ValkyrieOperator::Fahrenheit => 45000,
ValkyrieOperator::Transpose => 45000,
ValkyrieOperator::Transjugate => 45000,
ValkyrieOperator::Hermitian => 45000,
ValkyrieOperator::DivideByDecimalPower(_) => 45000,
}
}
pub fn accept_arguments(&self) -> usize {
match self {
ValkyrieOperator::Plus | ValkyrieOperator::Multiply => 0,
_ => 1,
}
}
pub fn overrideable(&self) -> bool {
match self {
ValkyrieOperator::Equal(false) => false,
ValkyrieOperator::StrictlyEqual(false) => false,
_ => true,
}
}
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PrefixNode<E> {
pub operator: OperatorNode,
pub body: E,
pub range: Range<usize>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct InfixNode<E> {
pub operator: OperatorNode,
pub lhs: E,
pub rhs: E,
pub range: Range<usize>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PostfixNode<E> {
pub operator: OperatorNode,
pub body: E,
pub range: Range<usize>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct OperatorNode {
pub kind: ValkyrieOperator,
pub range: Range<usize>,
}
impl<E> PrefixNode<E> {
pub fn update_range(mut self, range: Range<usize>) -> Self {
self.range = range;
self
}
}
impl OperatorNode {
pub fn new(kind: ValkyrieOperator, range: Range<usize>) -> Self {
Self { kind, range }
}
}