1use jrsonnet_evaluator::{function::builtin, typed::PositiveF64};23#[builtin]4pub fn builtin_abs(n: f64) -> f64 {5 n.abs()6}78#[builtin]9pub fn builtin_sign(n: f64) -> f64 {10 if n == 0. {11 0.12 } else {13 n.signum()14 }15}1617#[builtin]18pub fn builtin_max(a: f64, b: f64) -> f64 {19 a.max(b)20}2122#[builtin]23pub fn builtin_min(a: f64, b: f64) -> f64 {24 a.min(b)25}2627#[allow(non_snake_case)]28#[builtin]29pub fn builtin_clamp(x: f64, minVal: f64, maxVal: f64) -> f64 {30 x.clamp(minVal, maxVal)31}3233#[builtin]34pub fn builtin_sum(arr: Vec<f64>) -> f64 {35 arr.iter().sum()36}3738#[builtin]39pub fn builtin_modulo(x: f64, y: f64) -> f64 {40 x % y41}4243#[builtin]44pub fn builtin_floor(x: f64) -> f64 {45 x.floor()46}4748#[builtin]49pub fn builtin_ceil(x: f64) -> f64 {50 x.ceil()51}5253#[builtin]54pub fn builtin_log(x: f64) -> f64 {55 x.ln()56}5758#[builtin]59pub fn builtin_pow(x: f64, n: f64) -> f64 {60 x.powf(n)61}6263#[builtin]64pub fn builtin_sqrt(x: PositiveF64) -> f64 {65 x.0.sqrt()66}6768#[builtin]69pub fn builtin_sin(x: f64) -> f64 {70 x.sin()71}7273#[builtin]74pub fn builtin_cos(x: f64) -> f64 {75 x.cos()76}7778#[builtin]79pub fn builtin_tan(x: f64) -> f64 {80 x.tan()81}8283#[builtin]84pub fn builtin_asin(x: f64) -> f64 {85 x.asin()86}8788#[builtin]89pub fn builtin_acos(x: f64) -> f64 {90 x.acos()91}9293#[builtin]94pub fn builtin_atan(x: f64) -> f64 {95 x.atan()96}9798#[builtin]99pub fn builtin_atan2(y: f64, x: f64) -> f64 {100 y.atan2(x)101}102103#[builtin]104pub fn builtin_exp(x: f64) -> f64 {105 x.exp()106}107108fn frexp(s: f64) -> (f64, i16) {109 if s == 0.0 {110 (s, 0)111 } else {112 let lg = s.abs().log2();113 let x = (lg - lg.floor() - 1.0).exp2();114 let exp = lg.floor() + 1.0;115 (s.signum() * x, exp as i16)116 }117}118119#[builtin]120pub fn builtin_mantissa(x: f64) -> f64 {121 frexp(x).0122}123124#[builtin]125pub fn builtin_exponent(x: f64) -> i16 {126 frexp(x).1127}128129#[builtin]130pub fn builtin_round(x: f64) -> f64 {131 x.round()132}133134#[builtin]135pub fn builtin_is_even(x: f64) -> bool {136 builtin_round(x) % 2.0 == 0.0137}138139#[builtin]140#[allow(clippy::float_cmp)]141pub fn builtin_is_odd(x: f64) -> bool {142 builtin_round(x) % 2.0 == 1.0143}144145#[builtin]146#[allow(clippy::float_cmp)]147pub fn builtin_is_integer(x: f64) -> bool {148 builtin_round(x) == x149}150151#[builtin]152#[allow(clippy::float_cmp)]153pub fn builtin_is_decimal(x: f64) -> bool {154 builtin_round(x) != x155}