Skip to main content

rl_lang/interpreter/stdlib/math/
clamp.rs

1use crate::{
2    interpreter::{evaluator::Evaluator, values::Value},
3    utils::{errors::Error, span::Span},
4};
5
6pub fn std_clamp(
7    eval: &mut Evaluator,
8    value: Value,
9    min: Value,
10    max: Value,
11    span: Span,
12) -> Result<Value, Error> {
13    match (value, min, max) {
14        (Value::Integer(value), Value::Integer(low), Value::Integer(high)) => {
15            Ok(Value::Integer(value.clamp(low, high)))
16        }
17        (Value::Float(value), Value::Float(low), Value::Float(high)) => {
18            Ok(Value::Float(value.clamp(low, high)))
19        }
20        (value, min, max) => Err(eval.err(
21            format!(
22                "clamp() expects a number, got ({}, {}, {})",
23                value.type_name(),
24                min.type_name(),
25                max.type_name()
26            ),
27            span,
28        )),
29    }
30}