diff --git a/src/enumo/sexp.rs b/src/enumo/sexp.rs index 597e618a..543dcdd3 100644 --- a/src/enumo/sexp.rs +++ b/src/enumo/sexp.rs @@ -3,7 +3,7 @@ use std::str::FromStr; use super::*; /// S-expression -#[derive(PartialEq, Eq, Clone, Debug)] +#[derive(PartialEq, Eq, Clone, Debug, Hash)] pub enum Sexp { Atom(String), List(Vec), diff --git a/src/enumo/workload.rs b/src/enumo/workload.rs index 913d3338..1ce37b78 100644 --- a/src/enumo/workload.rs +++ b/src/enumo/workload.rs @@ -2,7 +2,7 @@ use egg::{EGraph, ENodeOrVar, RecExpr}; use super::*; use crate::{SynthAnalysis, SynthLanguage}; -use std::io::Write; +use std::{collections::HashSet, io::Write}; /// Workloads are sets of terms from a domain #[derive(PartialEq, Eq, Clone, Debug)] @@ -108,11 +108,11 @@ impl Workload { set } Workload::Append(workloads) => { - let mut set = vec![]; + let mut set = HashSet::new(); for w in workloads { set.extend(w.force()); } - set + set.into_iter().collect() } } } @@ -137,10 +137,10 @@ impl Workload { let into: Workload = workload.into(); match (self, into) { (Workload::Set(xs), Workload::Set(ys)) => { - let mut all = vec![]; + let mut all = HashSet::new(); all.extend(xs); all.extend(ys); - Workload::Set(all) + Workload::Set(all.into_iter().collect()) } (Workload::Append(xs), Workload::Append(ys)) => { let mut all = vec![]; @@ -265,6 +265,13 @@ mod test { } } + #[test] + fn append_dups() { + let w1 = Workload::new(["a", "b", "x"]); + let w2 = Workload::new(["c", "x", "d", "d"]); + assert!(w1.append(w2).force().len() == 5) + } + #[test] fn append() { let empty = Workload::Set(vec![]);