summaryrefslogtreecommitdiff
path: root/src/eval
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2023-04-04 23:27:51 +0200
committerLaurenz <laurmaedje@gmail.com>2023-04-04 23:43:34 +0200
commit715f9fb0a5b5242c405e2c9277596fad7509e0db (patch)
tree70d3faaddf30b8c40c3e37ae2346879abc32d799 /src/eval
parent23715e813e1888c8c317ec2f9649d0f1ad46bd8c (diff)
Locatable selectors
Diffstat (limited to 'src/eval')
-rw-r--r--src/eval/cast.rs16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/eval/cast.rs b/src/eval/cast.rs
index 7b507dbb..92e4212f 100644
--- a/src/eval/cast.rs
+++ b/src/eval/cast.rs
@@ -237,7 +237,7 @@ impl<T> Variadics for Vec<T> {
}
/// Describes a possible value for a cast.
-#[derive(Debug, Clone, Hash)]
+#[derive(Debug, Clone, Hash, PartialEq, PartialOrd)]
pub enum CastInfo {
/// Any value is okay.
Any,
@@ -302,15 +302,23 @@ impl Add for CastInfo {
fn add(self, rhs: Self) -> Self {
Self::Union(match (self, rhs) {
(Self::Union(mut lhs), Self::Union(rhs)) => {
- lhs.extend(rhs);
+ for cast in rhs {
+ if !lhs.contains(&cast) {
+ lhs.push(cast);
+ }
+ }
lhs
}
(Self::Union(mut lhs), rhs) => {
- lhs.push(rhs);
+ if !lhs.contains(&rhs) {
+ lhs.push(rhs);
+ }
lhs
}
(lhs, Self::Union(mut rhs)) => {
- rhs.insert(0, lhs);
+ if !rhs.contains(&lhs) {
+ rhs.insert(0, lhs);
+ }
rhs
}
(lhs, rhs) => vec![lhs, rhs],