summaryrefslogtreecommitdiff
path: root/src/eval
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2021-06-09 14:05:57 +0200
committerLaurenz <laurmaedje@gmail.com>2021-06-09 22:44:40 +0200
commitbce553a991f19b2b5bb9efef6b74bd12e15a10c6 (patch)
treefa8ed4b3974927b30e6cffd0d71d4c3e980698de /src/eval
parent29cfef0a6dfef5820bda339d327638e285aaf4d3 (diff)
Tidy up
Diffstat (limited to 'src/eval')
-rw-r--r--src/eval/mod.rs3
-rw-r--r--src/eval/ops.rs58
-rw-r--r--src/eval/value.rs32
3 files changed, 53 insertions, 40 deletions
diff --git a/src/eval/mod.rs b/src/eval/mod.rs
index 80be2e82..4b5feb0d 100644
--- a/src/eval/mod.rs
+++ b/src/eval/mod.rs
@@ -18,7 +18,6 @@ use std::rc::Rc;
use crate::cache::Cache;
use crate::color::Color;
use crate::diag::{Diag, DiagSet, Pass};
-use crate::geom::TrackSizing;
use crate::geom::{Angle, Fractional, Length, Relative};
use crate::loading::{FileHash, Loader};
use crate::parse::parse;
@@ -245,6 +244,7 @@ impl Eval for Expr {
fn eval(&self, ctx: &mut EvalContext) -> Self::Output {
match *self {
Self::None(_) => Value::None,
+ Self::Auto(_) => Value::Auto,
Self::Bool(_, v) => Value::Bool(v),
Self::Int(_, v) => Value::Int(v),
Self::Float(_, v) => Value::Float(v),
@@ -252,7 +252,6 @@ impl Eval for Expr {
Self::Angle(_, v, unit) => Value::Angle(Angle::with_unit(v, unit)),
Self::Percent(_, v) => Value::Relative(Relative::new(v / 100.0)),
Self::Fractional(_, v) => Value::Fractional(Fractional::new(v)),
- Self::Auto(_) => Value::TrackSizing(TrackSizing::Auto),
Self::Color(_, v) => Value::Color(Color::Rgba(v)),
Self::Str(_, ref v) => Value::Str(v.clone()),
Self::Ident(ref v) => match ctx.scopes.get(&v) {
diff --git a/src/eval/ops.rs b/src/eval/ops.rs
index 15c09e03..b6bd5402 100644
--- a/src/eval/ops.rs
+++ b/src/eval/ops.rs
@@ -11,8 +11,8 @@ pub fn pos(value: Value) -> Value {
Length(v) => Length(v),
Angle(v) => Angle(v),
Relative(v) => Relative(v),
- Fractional(v) => Fractional(v),
Linear(v) => Linear(v),
+ Fractional(v) => Fractional(v),
_ => Error,
}
}
@@ -25,8 +25,8 @@ pub fn neg(value: Value) -> Value {
Length(v) => Length(-v),
Angle(v) => Angle(-v),
Relative(v) => Relative(-v),
- Fractional(v) => Fractional(-v),
Linear(v) => Linear(-v),
+ Fractional(v) => Fractional(-v),
_ => Error,
}
}
@@ -34,29 +34,31 @@ pub fn neg(value: Value) -> Value {
/// Compute the sum of two values.
pub fn add(lhs: Value, rhs: Value) -> Value {
match (lhs, rhs) {
- // Math.
(Int(a), Int(b)) => Int(a + b),
(Int(a), Float(b)) => Float(a as f64 + b),
(Float(a), Int(b)) => Float(a + b as f64),
(Float(a), Float(b)) => Float(a + b),
+
(Angle(a), Angle(b)) => Angle(a + b),
+
(Length(a), Length(b)) => Length(a + b),
(Length(a), Relative(b)) => Linear(a + b),
(Length(a), Linear(b)) => Linear(a + b),
+
(Relative(a), Length(b)) => Linear(a + b),
(Relative(a), Relative(b)) => Relative(a + b),
(Relative(a), Linear(b)) => Linear(a + b),
- (Fractional(a), Fractional(b)) => Fractional(a + b),
+
(Linear(a), Length(b)) => Linear(a + b),
(Linear(a), Relative(b)) => Linear(a + b),
(Linear(a), Linear(b)) => Linear(a + b),
- // Collections.
+ (Fractional(a), Fractional(b)) => Fractional(a + b),
+
(Str(a), Str(b)) => Str(a + &b),
(Array(a), Array(b)) => Array(concat(a, b)),
(Dict(a), Dict(b)) => Dict(concat(a, b)),
- // Templates.
(Template(a), Template(b)) => Template(concat(a, b)),
(Template(a), None) => Template(a),
(None, Template(b)) => Template(b),
@@ -80,17 +82,23 @@ pub fn sub(lhs: Value, rhs: Value) -> Value {
(Int(a), Float(b)) => Float(a as f64 - b),
(Float(a), Int(b)) => Float(a - b as f64),
(Float(a), Float(b)) => Float(a - b),
+
(Angle(a), Angle(b)) => Angle(a - b),
+
(Length(a), Length(b)) => Length(a - b),
(Length(a), Relative(b)) => Linear(a - b),
(Length(a), Linear(b)) => Linear(a - b),
+
(Relative(a), Length(b)) => Linear(a - b),
(Relative(a), Relative(b)) => Relative(a - b),
(Relative(a), Linear(b)) => Linear(a - b),
- (Fractional(a), Fractional(b)) => Fractional(a - b),
+
(Linear(a), Length(b)) => Linear(a - b),
(Linear(a), Relative(b)) => Linear(a - b),
(Linear(a), Linear(b)) => Linear(a - b),
+
+ (Fractional(a), Fractional(b)) => Fractional(a - b),
+
_ => Error,
}
}
@@ -102,27 +110,37 @@ pub fn mul(lhs: Value, rhs: Value) -> Value {
(Int(a), Float(b)) => Float(a as f64 * b),
(Float(a), Int(b)) => Float(a * b as f64),
(Float(a), Float(b)) => Float(a * b),
+
(Length(a), Int(b)) => Length(a * b as f64),
(Length(a), Float(b)) => Length(a * b),
(Int(a), Length(b)) => Length(a as f64 * b),
(Float(a), Length(b)) => Length(a * b),
+
(Angle(a), Int(b)) => Angle(a * b as f64),
(Angle(a), Float(b)) => Angle(a * b),
(Int(a), Angle(b)) => Angle(a as f64 * b),
(Float(a), Angle(b)) => Angle(a * b),
+
(Relative(a), Int(b)) => Relative(a * b as f64),
(Relative(a), Float(b)) => Relative(a * b),
- (Fractional(a), Fractional(b)) => Fractional(a * b.get()),
- (Fractional(a), Int(b)) => Fractional(a * b as f64),
- (Fractional(a), Float(b)) => Fractional(a * b),
- (Int(a), Relative(b)) => Relative(a as f64 * b),
- (Int(a), Fractional(b)) => Fractional(a as f64 * b),
(Float(a), Relative(b)) => Relative(a * b),
- (Float(a), Fractional(b)) => Fractional(a * b),
+ (Int(a), Relative(b)) => Relative(a as f64 * b),
+
(Linear(a), Int(b)) => Linear(a * b as f64),
(Linear(a), Float(b)) => Linear(a * b),
(Int(a), Linear(b)) => Linear(a as f64 * b),
(Float(a), Linear(b)) => Linear(a * b),
+
+ (Float(a), Fractional(b)) => Fractional(a * b),
+ (Fractional(a), Int(b)) => Fractional(a * b as f64),
+ (Fractional(a), Float(b)) => Fractional(a * b),
+ (Int(a), Fractional(b)) => Fractional(a as f64 * b),
+
+ (Str(a), Int(b)) => Str(a.repeat(b.max(0) as usize)),
+ (Int(a), Str(b)) => Str(b.repeat(a.max(0) as usize)),
+ (Array(a), Int(b)) => Array(repeat(a, b.max(0) as usize)),
+ (Int(a), Array(b)) => Array(repeat(b, a.max(0) as usize)),
+
_ => Error,
}
}
@@ -134,20 +152,26 @@ pub fn div(lhs: Value, rhs: Value) -> Value {
(Int(a), Float(b)) => Float(a as f64 / b),
(Float(a), Int(b)) => Float(a / b as f64),
(Float(a), Float(b)) => Float(a / b),
+
(Length(a), Int(b)) => Length(a / b as f64),
(Length(a), Float(b)) => Length(a / b),
(Length(a), Length(b)) => Float(a / b),
+
(Angle(a), Int(b)) => Angle(a / b as f64),
(Angle(a), Float(b)) => Angle(a / b),
(Angle(a), Angle(b)) => Float(a / b),
+
(Relative(a), Int(b)) => Relative(a / b as f64),
(Relative(a), Float(b)) => Relative(a / b),
(Relative(a), Relative(b)) => Float(a / b),
- (Fractional(a), Fractional(b)) => Float(a.get() / b.get()),
+
(Fractional(a), Int(b)) => Fractional(a / b as f64),
(Fractional(a), Float(b)) => Fractional(a / b),
+ (Fractional(a), Fractional(b)) => Float(a / b),
+
(Linear(a), Int(b)) => Linear(a / b as f64),
(Linear(a), Float(b)) => Linear(a / b),
+
_ => Error,
}
}
@@ -209,3 +233,9 @@ where
a.extend(b);
a
}
+
+/// Repeat a vector `n` times.
+fn repeat<T: Clone>(vec: Vec<T>, n: usize) -> Vec<T> {
+ let len = n * vec.len();
+ vec.into_iter().cycle().take(len).collect()
+}
diff --git a/src/eval/value.rs b/src/eval/value.rs
index fa7993ed..51e45190 100644
--- a/src/eval/value.rs
+++ b/src/eval/value.rs
@@ -8,7 +8,7 @@ use std::rc::Rc;
use super::EvalContext;
use crate::color::{Color, RgbaColor};
use crate::exec::ExecContext;
-use crate::geom::{Angle, Fractional, Length, Linear, Relative, TrackSizing};
+use crate::geom::{Angle, Fractional, Length, Linear, Relative};
use crate::syntax::{Expr, Span, Spanned, Tree};
/// A computational value.
@@ -16,6 +16,8 @@ use crate::syntax::{Expr, Span, Spanned, Tree};
pub enum Value {
/// The value that indicates the absence of a meaningful value.
None,
+ /// A value that indicates some smart default behaviour.
+ Auto,
/// A boolean: `true, false`.
Bool(bool),
/// An integer: `120`.
@@ -28,12 +30,10 @@ pub enum Value {
Angle(Angle),
/// A relative value: `50%`.
Relative(Relative),
- /// A fractional value: `1fr`.
- Fractional(Fractional),
/// A combination of an absolute length and a relative value: `20% + 5cm`.
Linear(Linear),
- /// One of the units that can appear in a grid definition.
- TrackSizing(TrackSizing),
+ /// A fractional value: `1fr`.
+ Fractional(Fractional),
/// A color value: `#f79143ff`.
Color(Color),
/// A string: `"string"`.
@@ -73,15 +73,15 @@ impl Value {
pub fn type_name(&self) -> &'static str {
match self {
Self::None => "none",
+ Self::Auto => "auto",
Self::Bool(_) => bool::TYPE_NAME,
Self::Int(_) => i64::TYPE_NAME,
Self::Float(_) => f64::TYPE_NAME,
Self::Length(_) => Length::TYPE_NAME,
Self::Angle(_) => Angle::TYPE_NAME,
Self::Relative(_) => Relative::TYPE_NAME,
- Self::Fractional(_) => Fractional::TYPE_NAME,
Self::Linear(_) => Linear::TYPE_NAME,
- Self::TrackSizing(_) => TrackSizing::TYPE_NAME,
+ Self::Fractional(_) => Fractional::TYPE_NAME,
Self::Color(_) => Color::TYPE_NAME,
Self::Str(_) => String::TYPE_NAME,
Self::Array(_) => ArrayValue::TYPE_NAME,
@@ -100,14 +100,6 @@ impl Value {
(&Self::Float(a), &Self::Int(b)) => a == b as f64,
(&Self::Length(a), &Self::Linear(b)) => a == b.abs && b.rel.is_zero(),
(&Self::Relative(a), &Self::Linear(b)) => a == b.rel && b.abs.is_zero(),
- (&Self::Length(a), &Self::TrackSizing(b)) => TrackSizing::from(a) == b,
- (&Self::Relative(a), &Self::TrackSizing(b)) => TrackSizing::from(a) == b,
- (&Self::Linear(a), &Self::TrackSizing(b)) => TrackSizing::from(a) == b,
- (&Self::Fractional(a), &Self::TrackSizing(b)) => TrackSizing::from(a) == b,
- (&Self::TrackSizing(a), &Self::Length(b)) => TrackSizing::from(b) == a,
- (&Self::TrackSizing(a), &Self::Relative(b)) => TrackSizing::from(b) == a,
- (&Self::TrackSizing(a), &Self::Linear(b)) => TrackSizing::from(b) == a,
- (&Self::TrackSizing(a), &Self::Fractional(b)) => TrackSizing::from(b) == a,
(&Self::Linear(a), &Self::Length(b)) => a.abs == b && a.rel.is_zero(),
(&Self::Linear(a), &Self::Relative(b)) => a.rel == b && a.abs.is_zero(),
(Self::Array(a), Self::Array(b)) => {
@@ -615,21 +607,13 @@ primitive! {
primitive! { Length: "length", Value::Length }
primitive! { Angle: "angle", Value::Angle }
primitive! { Relative: "relative", Value::Relative }
-primitive! { Fractional: "fractional", Value::Fractional }
primitive! {
Linear: "linear",
Value::Linear,
Value::Length(v) => v.into(),
Value::Relative(v) => v.into(),
}
-primitive! {
- TrackSizing: "GridUnit",
- Value::TrackSizing,
- Value::Length(v) => v.into(),
- Value::Relative(v) => v.into(),
- Value::Linear(v) => v.into(),
- Value::Fractional(v) => v.into(),
-}
+primitive! { Fractional: "fractional", Value::Fractional }
primitive! { Color: "color", Value::Color }
primitive! { String: "string", Value::Str }
primitive! { ArrayValue: "array", Value::Array }