aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib.rs24
1 files changed, 14 insertions, 10 deletions
diff --git a/src/lib.rs b/src/lib.rs
index e203417..de670b7 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -481,15 +481,19 @@ mod op {
use super::Value;
use std::rc::Rc;
- fn tuple_op(a: &Rc<Vec<Value>>, b: &Rc<Vec<Value>>, f: fn (&Value, &Value) -> Value) -> Value {
+ fn tuple_bin_op(a: &Rc<Vec<Value>>, b: &Rc<Vec<Value>>, f: fn (&Value, &Value) -> Value) -> Value {
Value::Tuple(Rc::new(a.iter().zip(b.iter()).map(|(a, b)| f(a, b)).collect()))
}
+ fn tuple_un_op(a: &Rc<Vec<Value>>, f: fn (&Value) -> Value) -> Value {
+ Value::Tuple(Rc::new(a.iter().map(f).collect()))
+ }
+
pub fn neg(value: &Value) -> Value {
match value {
Value::Float(a) => Value::Float(-a),
Value::Int(a) => Value::Int(-a),
- Value::Tuple(a) => Value::Tuple(Rc::new(a.iter().map(neg).collect())),
+ Value::Tuple(a) => tuple_un_op(a, neg),
_ => Value::Nil,
}
}
@@ -497,7 +501,7 @@ mod op {
pub fn not(value: &Value) -> Value {
match value {
Value::Bool(a) => Value::Bool(!a),
- Value::Tuple(a) => Value::Tuple(Rc::new(a.iter().map(not).collect())),
+ Value::Tuple(a) => tuple_un_op(a, not),
_ => Value::Nil,
}
}
@@ -508,7 +512,7 @@ mod op {
(Value::Float(a), Value::Float(b)) => Value::Float(a + b),
(Value::Int(a), Value::Int(b)) => Value::Int(a + b),
(Value::String(a), Value::String(b)) => Value::String(Rc::from(format!("{}{}", a, b))),
- (Value::Tuple(a), Value::Tuple(b)) if a.len() == b.len() => tuple_op(a, b, add),
+ (Value::Tuple(a), Value::Tuple(b)) if a.len() == b.len() => tuple_bin_op(a, b, add),
_ => Value::Nil,
}
}
@@ -521,7 +525,7 @@ mod op {
match (a, b) {
(Value::Float(a), Value::Float(b)) => Value::Float(a * b),
(Value::Int(a), Value::Int(b)) => Value::Int(a * b),
- (Value::Tuple(a), Value::Tuple(b)) if a.len() == b.len() => tuple_op(a, b, mul),
+ (Value::Tuple(a), Value::Tuple(b)) if a.len() == b.len() => tuple_bin_op(a, b, mul),
_ => Value::Nil,
}
}
@@ -530,7 +534,7 @@ mod op {
match (a, b) {
(Value::Float(a), Value::Float(b)) => Value::Float(a / b),
(Value::Int(a), Value::Int(b)) => Value::Int(a / b),
- (Value::Tuple(a), Value::Tuple(b)) if a.len() == b.len() => tuple_op(a, b, div),
+ (Value::Tuple(a), Value::Tuple(b)) if a.len() == b.len() => tuple_bin_op(a, b, div),
_ => Value::Nil,
}
}
@@ -541,7 +545,7 @@ mod op {
(Value::Int(a), Value::Int(b)) => Value::Bool(a == b),
(Value::String(a), Value::String(b)) => Value::Bool(a == b),
(Value::Bool(a), Value::Bool(b)) => Value::Bool(a == b),
- (Value::Tuple(a), Value::Tuple(b)) if a.len() == b.len() => tuple_op(a, b, eq),
+ (Value::Tuple(a), Value::Tuple(b)) if a.len() == b.len() => tuple_bin_op(a, b, eq),
_ => Value::Nil,
}
}
@@ -552,7 +556,7 @@ mod op {
(Value::Int(a), Value::Int(b)) => Value::Bool(a < b),
(Value::String(a), Value::String(b)) => Value::Bool(a < b),
(Value::Bool(a), Value::Bool(b)) => Value::Bool(a < b),
- (Value::Tuple(a), Value::Tuple(b)) if a.len() == b.len() => tuple_op(a, b, less),
+ (Value::Tuple(a), Value::Tuple(b)) if a.len() == b.len() => tuple_bin_op(a, b, less),
_ => Value::Nil,
}
}
@@ -564,7 +568,7 @@ mod op {
pub fn and(a: &Value, b: &Value) -> Value {
match (a, b) {
(Value::Bool(a), Value::Bool(b)) => Value::Bool(*a && *b),
- (Value::Tuple(a), Value::Tuple(b)) if a.len() == b.len() => tuple_op(a, b, and),
+ (Value::Tuple(a), Value::Tuple(b)) if a.len() == b.len() => tuple_bin_op(a, b, and),
_ => Value::Nil,
}
}
@@ -572,7 +576,7 @@ mod op {
pub fn or(a: &Value, b: &Value) -> Value {
match (a, b) {
(Value::Bool(a), Value::Bool(b)) => Value::Bool(*a || *b),
- (Value::Tuple(a), Value::Tuple(b)) if a.len() == b.len() => tuple_op(a, b, or),
+ (Value::Tuple(a), Value::Tuple(b)) if a.len() == b.len() => tuple_bin_op(a, b, or),
_ => Value::Nil,
}
}