use cas_domain::{Integer, Rational};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(crate) struct Span {
pub off: u32,
pub len: u16,
}
#[derive(Clone, Debug, Eq)]
pub(crate) enum Node {
Int(Integer),
Rat(Rational),
Float {
bits: u64,
},
Sym(u32),
Fn {
head: u32,
args: Span,
},
Pow {
base: u32,
exp: u32,
},
Mul {
args: Span,
},
Add {
args: Span,
},
}
impl PartialEq for Node {
fn eq(&self, other: &Self) -> bool {
match (self, other) {
(Node::Int(a), Node::Int(b)) => a == b,
(Node::Rat(a), Node::Rat(b)) => a == b,
(Node::Float { bits: a, .. }, Node::Float { bits: b, .. }) => a == b,
(Node::Sym(a), Node::Sym(b)) => a == b,
(Node::Pow { base: a, exp: b }, Node::Pow { base: c, exp: d }) => a == c && b == d,
(Node::Fn { head: a, .. }, Node::Fn { head: b, .. }) => a == b,
(Node::Mul { .. }, Node::Mul { .. }) => true,
(Node::Add { .. }, Node::Add { .. }) => true,
_ => false,
}
}
}