difftreelog
feat add std.avg
in: master
Upstream issue: https://github.com/google/jsonnet/pull/1087
3 files changed
crates/jrsonnet-stdlib/src/arrays.rsdiffbeforeafterboth--- a/crates/jrsonnet-stdlib/src/arrays.rs
+++ b/crates/jrsonnet-stdlib/src/arrays.rs
@@ -1,12 +1,22 @@
+#![allow(non_snake_case)]
+
use jrsonnet_evaluator::{
error::{ErrorKind::RuntimeError, Result},
function::{builtin, FuncVal},
throw,
typed::{BoundedI32, BoundedUsize, Either2, NativeFn, Typed},
val::{equals, ArrValue, IndexableVal, StrValue},
- Either, IStr, Val,
+ Either, IStr, Thunk, Val,
};
+pub(crate) fn eval_on_empty(on_empty: Option<Thunk<Val>>) -> Result<Val> {
+ if let Some(on_empty) = on_empty {
+ on_empty.evaluate()
+ } else {
+ throw!("expected non-empty array")
+ }
+}
+
#[builtin]
pub fn builtin_make_array(sz: BoundedI32<0, { i32::MAX }>, func: FuncVal) -> Result<ArrValue> {
if *sz == 0 {
@@ -230,3 +240,11 @@
}
Ok(count)
}
+
+#[builtin]
+pub fn builtin_avg(arr: Vec<f64>, onEmpty: Option<Thunk<Val>>) -> Result<Val> {
+ if arr.is_empty() {
+ return eval_on_empty(onEmpty);
+ }
+ Ok(Val::Num(arr.iter().sum::<f64>() / (arr.len() as f64)))
+}
crates/jrsonnet-stdlib/src/lib.rsdiffbeforeafterboth--- a/crates/jrsonnet-stdlib/src/lib.rs
+++ b/crates/jrsonnet-stdlib/src/lib.rs
@@ -81,6 +81,7 @@
("all", builtin_all::INST),
("member", builtin_member::INST),
("count", builtin_count::INST),
+ ("avg", builtin_avg::INST),
// Math
("abs", builtin_abs::INST),
("sign", builtin_sign::INST),
crates/jrsonnet-stdlib/src/sort.rsdiffbeforeafterboth13use jrsonnet_gcmodule::Cc;13use jrsonnet_gcmodule::Cc;14use jrsonnet_parser::BinaryOpType;14use jrsonnet_parser::BinaryOpType;1516use crate::eval_on_empty;151716#[derive(Copy, Clone)]18#[derive(Copy, Clone)]17enum SortKeyType {19enum SortKeyType {207 }209 }208}210}209211210fn eval_on_empty(on_empty: Option<Thunk<Val>>) -> Result<Val> {211 if let Some(on_empty) = on_empty {212 on_empty.evaluate()213 } else {214 throw!("expected non-empty array")215 }216}217212218fn eval_keyf(val: Val, key_f: &Option<FuncVal>) -> Result<Val> {213fn eval_keyf(val: Val, key_f: &Option<FuncVal>) -> Result<Val> {219 if let Some(key_f) = key_f {214 if let Some(key_f) = key_f {