summaryrefslogtreecommitdiff
path: root/src/library/utility.rs
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2021-08-30 16:59:09 +0200
committerLaurenz <laurmaedje@gmail.com>2021-08-30 16:59:09 +0200
commitee84bf74083f5b9cc88a2a0a968dc905b1eef22c (patch)
treed2756f462ee242c328c526d2a65de4105830cb27 /src/library/utility.rs
parentff25573224400673d08b31e576d5a0d87751dbe1 (diff)
Add abs() function
Diffstat (limited to 'src/library/utility.rs')
-rw-r--r--src/library/utility.rs15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/library/utility.rs b/src/library/utility.rs
index b26ed154..0ece88ac 100644
--- a/src/library/utility.rs
+++ b/src/library/utility.rs
@@ -45,6 +45,21 @@ pub fn rgb(_: &mut EvalContext, args: &mut Arguments) -> TypResult<Value> {
)))
}
+/// `abs`: The absolute value of a numeric value.
+pub fn abs(_: &mut EvalContext, args: &mut Arguments) -> TypResult<Value> {
+ let Spanned { v, span } = args.expect("numeric value")?;
+ Ok(match v {
+ Value::Int(v) => Value::Int(v.abs()),
+ Value::Float(v) => Value::Float(v.abs()),
+ Value::Length(v) => Value::Length(v.abs()),
+ Value::Angle(v) => Value::Angle(v.abs()),
+ Value::Relative(v) => Value::Relative(v.abs()),
+ Value::Fractional(v) => Value::Fractional(v.abs()),
+ Value::Linear(_) => bail!(span, "cannot take absolute value of a linear"),
+ _ => bail!(span, "expected numeric value"),
+ })
+}
+
/// `min`: The minimum of a sequence of values.
pub fn min(_: &mut EvalContext, args: &mut Arguments) -> TypResult<Value> {
minmax(args, Ordering::Less)