summaryrefslogtreecommitdiff
path: root/src/eval
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2021-02-12 23:11:47 +0100
committerLaurenz <laurmaedje@gmail.com>2021-02-12 23:11:47 +0100
commit094462cbdda15f19d2dc071b18201f656b8ddcd4 (patch)
tree0994b286aa1718cbc1a0b9523a934c1fb3f6f755 /src/eval
parent58f799c41cb71f167e6e82eb94b3cde1303de11e (diff)
Make templates and strings summable 🥪
Diffstat (limited to 'src/eval')
-rw-r--r--src/eval/ops.rs12
-rw-r--r--src/eval/value.rs2
2 files changed, 13 insertions, 1 deletions
diff --git a/src/eval/ops.rs b/src/eval/ops.rs
index c52a62ca..c4adf587 100644
--- a/src/eval/ops.rs
+++ b/src/eval/ops.rs
@@ -30,6 +30,7 @@ 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),
@@ -45,14 +46,23 @@ pub fn add(lhs: Value, rhs: Value) -> Value {
(Linear(a), Relative(b)) => Linear(a + b),
(Linear(a), Linear(b)) => Linear(a + b),
+ // Collections.
(Str(a), Str(b)) => Str(a + &b),
(Array(a), Array(b)) => Array(concat(a, b)),
(Dict(a), Dict(b)) => Dict(concat(a, b)),
- // TODO: Add string and template.
+ // Templates.
(Template(a), Template(b)) => Template(concat(a, b)),
(Template(a), None) => Template(a),
(None, Template(b)) => Template(b),
+ (Template(mut a), Str(b)) => Template({
+ a.push(TemplateNode::Str(b));
+ a
+ }),
+ (Str(a), Template(mut b)) => Template({
+ b.insert(0, TemplateNode::Str(a));
+ b
+ }),
_ => Error,
}
diff --git a/src/eval/value.rs b/src/eval/value.rs
index 2879e6d6..e175b9ff 100644
--- a/src/eval/value.rs
+++ b/src/eval/value.rs
@@ -119,6 +119,8 @@ pub enum TemplateNode {
/// The evaluated expressions for the `tree`.
map: ExprMap,
},
+ /// A template that was converted from a string.
+ Str(String),
/// A template that can implement custom behaviour.
Any(TemplateAny),
}