summaryrefslogtreecommitdiff
path: root/src/eval/template.rs
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2021-07-29 12:01:06 +0200
committerLaurenz <laurmaedje@gmail.com>2021-07-29 12:01:06 +0200
commit853361338bd756c23992041511b1836a2cd0647f (patch)
tree335e632ed0de6090d3139b5f39d02d03ba471bad /src/eval/template.rs
parent312dcd070cf79c1dd5503f90ef10588fe4612108 (diff)
Better addition and iteration for array, dict and template
Diffstat (limited to 'src/eval/template.rs')
-rw-r--r--src/eval/template.rs20
1 files changed, 15 insertions, 5 deletions
diff --git a/src/eval/template.rs b/src/eval/template.rs
index 0be2492b..33f2b896 100644
--- a/src/eval/template.rs
+++ b/src/eval/template.rs
@@ -1,12 +1,12 @@
use std::collections::HashMap;
use std::fmt::{self, Debug, Formatter};
-use std::ops::{Add, Deref};
+use std::ops::{Add, AddAssign, Deref};
use std::rc::Rc;
use super::Value;
-use crate::util::EcoString;
use crate::exec::ExecContext;
use crate::syntax::{Expr, SyntaxTree};
+use crate::util::EcoString;
/// A template value: `[*Hi* there]`.
#[derive(Default, Debug, Clone)]
@@ -50,15 +50,25 @@ impl PartialEq for Template {
}
}
-impl Add<&Template> for Template {
+impl Add for Template {
type Output = Self;
- fn add(mut self, rhs: &Self) -> Self::Output {
- Rc::make_mut(&mut self.nodes).extend(rhs.nodes.iter().cloned());
+ fn add(mut self, rhs: Self) -> Self::Output {
+ self += rhs;
self
}
}
+impl AddAssign for Template {
+ fn add_assign(&mut self, rhs: Template) {
+ let sink = Rc::make_mut(&mut self.nodes);
+ match Rc::try_unwrap(rhs.nodes) {
+ Ok(source) => sink.extend(source),
+ Err(rc) => sink.extend(rc.iter().cloned()),
+ }
+ }
+}
+
impl Add<EcoString> for Template {
type Output = Self;