rl_lang/interpreter/stdlib/math/
modulo.rs1use 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}