diff options
Diffstat (limited to 'src/library')
| -rw-r--r-- | src/library/mod.rs | 1 | ||||
| -rw-r--r-- | src/library/utility.rs | 15 |
2 files changed, 16 insertions, 0 deletions
diff --git a/src/library/mod.rs b/src/library/mod.rs index d02c9608..ca99d43b 100644 --- a/src/library/mod.rs +++ b/src/library/mod.rs @@ -61,6 +61,7 @@ pub fn new() -> Scope { std.def_func("repr", repr); std.def_func("len", len); std.def_func("rgb", rgb); + std.def_func("abs", abs); std.def_func("min", min); std.def_func("max", max); std.def_func("lower", lower); 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) |
