The Jest Programming Language
Something went wrong. Try again.
Rust
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283use crate::runtime::{eval_trampoline, Budget, Eval, Number, Value};use crate::runtime::Scope;use crate::{Error, Result};
use super::helpers::{eval_array_inner, eval_index};
pub fn op_count( args: &[Value], budget: &Budget, eval_limit: &mut usize, scope: Scope,) -> Result<Eval> { match args { [arg] => { let arr = eval_array_inner(arg.clone(), budget, eval_limit, scope, "count", 0)?; Eval::done(Value::Number(Number::Integer(num_bigint::BigInt::from(arr.len())))) } _ => Err(Error::arity("count", "1", args.len())), }}
pub fn op_nth( args: &[Value], budget: &Budget, eval_limit: &mut usize, scope: Scope,) -> Result<Eval> { match args { [arr_arg, idx_arg] => { let arr = eval_array_inner(arr_arg.clone(), budget, eval_limit, scope.clone(), "nth", 0)?; let i = eval_index(idx_arg.clone(), budget, eval_limit, scope, "nth", 1)?; arr.get(i).cloned().ok_or_else(|| Error::Access { data: Value::Array(arr.clone()).to_string(), key: i.to_string(), }).map(Eval::Done) } _ => Err(Error::arity("nth", "2", args.len())), }}
pub fn op_cons( args: &[Value], budget: &Budget, eval_limit: &mut usize, scope: Scope,) -> Result<Eval> { match args { [elem_arg, arr_arg] => { let elem = eval_trampoline(budget, eval_limit, elem_arg.clone(), scope.clone())?; let arr = eval_array_inner(arr_arg.clone(), budget, eval_limit, scope, "cons", 1)?; let items: Vec<Value> = std::iter::once(elem).chain(arr.iter().cloned()).collect(); Value::array(items, budget).map(Eval::Done) } _ => Err(Error::arity("cons", "2", args.len())), }}
pub fn op_slice( args: &[Value], budget: &Budget, eval_limit: &mut usize, scope: Scope,) -> Result<Eval> { match args { [arr_arg, start_arg] => { let arr = eval_array_inner(arr_arg.clone(), budget, eval_limit, scope.clone(), "slice", 0)?; let start = eval_index(start_arg.clone(), budget, eval_limit, scope, "slice", 1)?; let items: Vec<Value> = arr.iter().skip(start).cloned().collect(); Value::array(items, budget).map(Eval::Done) } [arr_arg, start_arg, end_arg] => { let arr = eval_array_inner(arr_arg.clone(), budget, eval_limit, scope.clone(), "slice", 0)?; let start = eval_index(start_arg.clone(), budget, eval_limit, scope.clone(), "slice", 1)?; let end = eval_index(end_arg.clone(), budget, eval_limit, scope, "slice", 2)?; let items: Vec<Value> = arr.iter().skip(start).take(end.saturating_sub(start)).cloned().collect(); Value::array(items, budget).map(Eval::Done) } _ => Err(Error::arity("slice", "2 or 3", args.len())), }}