// AST

use nom_locate::LocatedSpan;

pub type Span<'a> = LocatedSpan<&'a str>;

#[derive(Debug, Clone, Copy, PartialEq)]
pub enum Op {
    Eq,
    Neq,
    And,
    Or,
    Add,
    Sub,
    Mul,
    Div,
    Pow,
    Not,
}

type SpanOp<'a> = (Span<'a>, Op);

#[derive(Debug, Clone, PartialEq)]
pub enum Expr<'a> {
    Num(i32),
    Par(Box<SpanExpr<'a>>),
    // Identifier
    // Function application
    BinOp(Op, Box<SpanExpr<'a>>, Box<SpanExpr<'a>>),
    UnaryOp(Op, Box<SpanExpr<'a>>),
}

pub type SpanExpr<'a> = (Span<'a>, Expr<'a>);