From 64faa5bad78b74fff1aca73987b010cb2961c027 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edvard=20Th=C3=B6rnros?= Date: Tue, 9 Mar 2021 17:46:37 +0100 Subject: more hash sets! --- src/lib.rs | 7 ++++--- src/vm.rs | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/lib.rs b/src/lib.rs index 6f63ad7..5ea0b63 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -228,7 +228,7 @@ pub enum Value { Blob(Rc), Instance(Rc, Rc>>), Tuple(Rc>), - Union(Vec), + Union(HashSet), Float(f64), Int(i64), Bool(bool), @@ -627,6 +627,7 @@ pub enum Op { mod op { use super::{Type, Value}; use std::rc::Rc; + use std::collections::HashSet; fn tuple_bin_op(a: &Rc>, b: &Rc>, f: fn (&Value, &Value) -> Value) -> Value { Value::Tuple(Rc::new(a.iter().zip(b.iter()).map(|(a, b)| f(a, b)).collect())) @@ -636,7 +637,7 @@ mod op { Value::Tuple(Rc::new(a.iter().map(f).collect())) } - fn union_un_op(a: &Vec, f: fn (&Value) -> Value) -> Value { + fn union_un_op(a: &HashSet, f: fn (&Value) -> Value) -> Value { a.iter().find_map(|x| { let x = f(x); if x.is_nil() { @@ -647,7 +648,7 @@ mod op { }).unwrap_or(Value::Nil) } - fn union_bin_op(a: &Vec, b: &Value, f: fn (&Value, &Value) -> Value) -> Value { + fn union_bin_op(a: &HashSet, b: &Value, f: fn (&Value, &Value) -> Value) -> Value { a.iter().find_map(|x| { let x = f(x, b); if x.is_nil() { diff --git a/src/vm.rs b/src/vm.rs index f99f611..3652321 100644 --- a/src/vm.rs +++ b/src/vm.rs @@ -773,10 +773,10 @@ impl VM { let mut err = None; self.stack[new_base] = match callable { Value::Union(alts) => { - let mut returns = Vec::new(); + let mut returns = HashSet::new(); for alt in alts.iter() { if let Ok(res) = call_callable(&alt) { - returns.push(res); + returns.insert(res); } } if returns.is_empty() { -- cgit v1.2.1