Skip to main content

rl_lang/interpreter/stdlib/bitwise/
count_bits.rs

1use crate::{
2    interpreter::{evaluator::Evaluator, values::Value},
3    utils::{errors::Error, span::Span},
4};
5
6pub fn std_count_bits(eval: &mut Evaluator, args: Vec<Value>, span: Span) -> Result<Value, Error> {
7    if args.len() != 1 {
8        return Err(eval.err(
9            format!("count_bits() expects 1 argument, got {}", args.len()),
10            span,
11        ));
12    }
13
14    match args.into_iter().next().unwrap_or(Value::Null) {
15        Value::Byte(x) => Ok(Value::Byte(x.count_ones() as u8)),
16        Value::Integer(x) => Ok(Value::Integer(x.count_ones() as i64)),
17        _ => Err(eval.err("count_bits() expects a byte or an int".to_string(), span)),
18    }
19}