Skip to main content

rl_lang/interpreter/stdlib/math/
modulo.rs

1use crate::{
2    interpreter::{evaluator::Evaluator, values::Value},
3    utils::{errors::Error, span::Span},
4};
5
6pub fn std_mod(eval: &mut Evaluator, a: Value, b: Value, span: Span) -> Result<Value, Error> {
7    let a = normalize_numeric(a);
8    let b = normalize_numeric(b);
9
10    match (a, b) {
11        (Value::Integer(a), Value::Integer(b)) => Ok(Value::Integer(a % b)),
12        (Value::Float(a), Value::Float(b)) => Ok(Value::Float(a % b)),
13        (Value::Integer(a), Value::Float(b)) => Ok(Value::Float(a as f64 % b)),
14        (Value::Float(a), Value::Integer(b)) => Ok(Value::Float(a % b as f64)),
15        (a, b) => Err(eval.err(
16            format!(
17                "mod() expects a number, got ({}, {})",
18                a.type_name(),
19                b.type_name()
20            ),
21            span,
22        )),
23    }
24}
25
26fn normalize_numeric(v: Value) -> Value {
27    match v {
28        Value::Byte(b) => Value::Integer(b as i64),
29        other => other,
30    }
31}