frg 0.1.1

Compiled programming language with frogs!
Documentation
use super::*;

pub fn eval_binary_ops(
    ctx: &mut ExecutionContext,
    left: &Expression,
    op: &BinaryOp,
    right: &Expression,
) -> VariableValue {
    let left = eval(ctx, left);
    let og_left = left.clone();
    let right = eval(ctx, right);
    match left {
        VariableValue::Int(left) => {
            let VariableValue::Int(right) = right else {
                panic!("{og_left:?} and {right:?} cant be {op:?}")
            };
            match op {
                BinaryOp::Add => VariableValue::Int(left + right),
                BinaryOp::Subtract => VariableValue::Int(left - right),
                BinaryOp::Multiply => VariableValue::Int(left * right),
                BinaryOp::Divide => VariableValue::Int(left / right),
                BinaryOp::LessThan => VariableValue::Bool(left < right),
                BinaryOp::LessThanOrEqual => VariableValue::Bool(left <= right),
                BinaryOp::GreaterThan => VariableValue::Bool(left > right),
                BinaryOp::GreaterThanOrEqual => VariableValue::Bool(left >= right),
                BinaryOp::Equals => VariableValue::Bool(left == right),
                BinaryOp::Index => panic!("cant index into int"),
            }
        }
        VariableValue::Float(left) => {
            let VariableValue::Float(right) = right else {
                panic!("{og_left:?} and {right:?} cant be {op:?}")
            };
            match op {
                BinaryOp::Add => VariableValue::Float(left + right),
                BinaryOp::Subtract => VariableValue::Float(left - right),
                BinaryOp::Multiply => VariableValue::Float(left * right),
                BinaryOp::Divide => VariableValue::Float(left / right),
                BinaryOp::LessThan => VariableValue::Bool(left < right),
                BinaryOp::LessThanOrEqual => VariableValue::Bool(left <= right),
                BinaryOp::GreaterThan => VariableValue::Bool(left > right),
                BinaryOp::GreaterThanOrEqual => VariableValue::Bool(left >= right),
                BinaryOp::Equals => VariableValue::Bool(left == right),
                BinaryOp::Index => panic!("cant index into float"),
            }
        }
        VariableValue::Vec(left) => {
            let VariableValue::Int(right) = right else {
                panic!("TODO: this error message")
            };
            match op {
                BinaryOp::Index => left[right as usize].clone(),
                _ => todo!(),
            }
        }
        _ => todo!(),
    }
}