use crate::lexer::Token;

#[derive(PartialOrd, PartialEq, Clone, Copy)]
pub enum Precedence {
    Lowest,
    Assign,
    Range,
    Or,
    And,
    BitOr,
    BitXor,
    BitAnd,
    Equals,
    LessGreater,
    Shift,
    Sum,
    Product,
    Prefix,
    Call,
    Index,
}

impl Token {
    pub fn precedence(&self) -> Precedence {
        match self {
            Token::Assign
            | Token::PlusAssign | Token::MinusAssign
            | Token::MulAssign | Token::DivAssign | Token::ModAssign => Precedence::Assign,
            Token::Range | Token::RangeInclusive => Precedence::Range,
            Token::Or => Precedence::Or,
            Token::And => Precedence::And,
            Token::Pipe => Precedence::BitOr,
            Token::Caret => Precedence::BitXor,
            Token::Ampersand => Precedence::BitAnd,
            Token::Eq | Token::NotEq => Precedence::Equals,
            Token::Lt | Token::Gt | Token::Lte | Token::Gte => Precedence::LessGreater,
            Token::Shl | Token::Shr => Precedence::Shift,
            Token::Plus | Token::Minus => Precedence::Sum,
            Token::Asterisk | Token::Slash | Token::Percent => Precedence::Product,
            Token::LParen => Precedence::Call,
            Token::LBracket => Precedence::Index,
            Token::Dot => Precedence::Index,
            Token::Question => Precedence::Index,
            _ => Precedence::Lowest,
        }
    }
}
