From 174113f235ac9683748555f000199337a7921ccc Mon Sep 17 00:00:00 2001 From: Ben Lambert Date: Mon, 13 Nov 2023 09:39:34 +0100 Subject: [PATCH 1/2] add i64 and f32 numeric types --- Cargo.lock | 2 +- charming/src/datatype/source.rs | 64 +++++++++++++++++++++++++++++---- charming/src/datatype/value.rs | 18 ++++++++-- 3 files changed, 75 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7a7468f..de623e2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -249,7 +249,7 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "charming" -version = "0.2.4" +version = "0.2.5" dependencies = [ "deno_core", "handlebars", diff --git a/charming/src/datatype/source.rs b/charming/src/datatype/source.rs index 84ac87b..c395745 100644 --- a/charming/src/datatype/source.rs +++ b/charming/src/datatype/source.rs @@ -6,7 +6,9 @@ use super::CompositeValue; #[serde(untagged)] pub enum DataSource { Integers(Vec>), - Floats(Vec>), + BigIntegers(Vec>), + Floats(Vec>), + BigFloats(Vec>), Mixed(Vec>), } @@ -16,9 +18,21 @@ impl From>> for DataSource { } } +impl From>> for DataSource { + fn from(v: Vec>) -> Self { + DataSource::BigIntegers(v) + } +} + +impl From>> for DataSource { + fn from(v: Vec>) -> Self { + DataSource::Floats(v) + } +} + impl From>> for DataSource { fn from(v: Vec>) -> Self { - DataSource::Floats(v) + DataSource::BigFloats(v) } } @@ -55,10 +69,22 @@ mod test { assert_eq!(n, NumericValue::Integer(42)); } + #[test] + fn numeric_value_from_i64() { + let n: NumericValue = 42i64.into(); + assert_eq!(n, NumericValue::BigInteger(42)); + } + + #[test] + fn numeric_value_from_f32() { + let n: NumericValue = 0.618f32.into(); + assert_eq!(n, NumericValue::Float(0.618)); + } + #[test] fn numeric_value_from_f64() { let n: NumericValue = 0.618f64.into(); - assert_eq!(n, NumericValue::Float(0.618)); + assert_eq!(n, NumericValue::BigFloat(0.618)); } #[test] @@ -79,18 +105,44 @@ mod test { assert_eq!(ds, DataSource::Integers(vec![vec![1, 2, 3], vec![4, 5, 6]])); } + #[test] + fn data_frame_from_bigintegers() { + let ds: DataSource = vec![vec![1i64, 2i64, 3i64], vec![4i64, 5i64, 6i64]].into(); + assert_eq!( + ds, + DataSource::BigIntegers(vec![vec![1i64, 2i64, 3i64], vec![4i64, 5i64, 6i64]]) + ); + } + #[test] fn data_frame_from_floats() { - let ds: DataSource = vec![vec![1.0, 2.0, 3.0], vec![4.0, 5.0, 6.0]].into(); + let ds: DataSource = + vec![vec![1.0f32, 2.0f32, 3.0f32], vec![4.0f32, 5.0f32, 6.0f32]].into(); assert_eq!( ds, - DataSource::Floats(vec![vec![1.0, 2.0, 3.0], vec![4.0, 5.0, 6.0]]) + DataSource::Floats(vec![ + vec![1.0f32, 2.0f32, 3.0f32], + vec![4.0f32, 5.0f32, 6.0f32] + ]) + ); + } + + #[test] + fn data_frame_from_bigfloats() { + let ds: DataSource = + vec![vec![1.0f64, 2.0f64, 3.0f64], vec![4.0f64, 5.0f64, 6.0f64]].into(); + assert_eq!( + ds, + DataSource::BigFloats(vec![ + vec![1.0f64, 2.0f64, 3.0f64], + vec![4.0f64, 5.0f64, 6.0f64] + ]) ); } #[test] fn data_frame_from_mixed() { - let ds = ds!([1, "Tuesday", 3.0], ["Monday", 2, "Wednesday"]); + let ds = ds!([1i32, "Tuesday", 3.0f32], ["Monday", 2i32, "Wednesday"]); assert_eq!( ds, DataSource::Mixed(vec![ diff --git a/charming/src/datatype/value.rs b/charming/src/datatype/value.rs index 07c8865..93e1bd7 100644 --- a/charming/src/datatype/value.rs +++ b/charming/src/datatype/value.rs @@ -4,7 +4,9 @@ use serde::{Deserialize, Serialize}; #[serde(untagged)] pub enum NumericValue { Integer(i32), - Float(f64), + BigInteger(i64), + Float(f32), + BigFloat(f64), } impl From for NumericValue { @@ -13,9 +15,21 @@ impl From for NumericValue { } } +impl From for NumericValue { + fn from(n: i64) -> Self { + NumericValue::BigInteger(n) + } +} + +impl From for NumericValue { + fn from(n: f32) -> Self { + NumericValue::Float(n) + } +} + impl From for NumericValue { fn from(n: f64) -> Self { - NumericValue::Float(n) + NumericValue::BigFloat(n) } } From bd16b17b9165980b7bc8ab6a41c6860dd69430f0 Mon Sep 17 00:00:00 2001 From: Ben Lambert Date: Wed, 15 Nov 2023 08:19:06 +0100 Subject: [PATCH 2/2] update values.rs and source.rs --- charming/src/datatype/source.rs | 43 +++++++++++++++++++++------------ charming/src/datatype/value.rs | 14 +++++------ 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/charming/src/datatype/source.rs b/charming/src/datatype/source.rs index c395745..b55f2b0 100644 --- a/charming/src/datatype/source.rs +++ b/charming/src/datatype/source.rs @@ -5,34 +5,40 @@ use super::CompositeValue; #[derive(Debug, Clone, PartialEq, PartialOrd, Serialize)] #[serde(untagged)] pub enum DataSource { - Integers(Vec>), - BigIntegers(Vec>), - Floats(Vec>), - BigFloats(Vec>), + Integers(Vec>), + Floats(Vec>), Mixed(Vec>), } impl From>> for DataSource { fn from(v: Vec>) -> Self { - DataSource::Integers(v) + let t: Vec> = v + .iter() + .map(|x| x.iter().map(|y| *y as i64).collect()) + .collect(); + DataSource::Integers(t) } } impl From>> for DataSource { fn from(v: Vec>) -> Self { - DataSource::BigIntegers(v) + DataSource::Integers(v) } } impl From>> for DataSource { fn from(v: Vec>) -> Self { - DataSource::Floats(v) + let t: Vec> = v + .iter() + .map(|x| x.iter().map(|y| *y as f64).collect()) + .collect(); + DataSource::Floats(t) } } impl From>> for DataSource { fn from(v: Vec>) -> Self { - DataSource::BigFloats(v) + DataSource::Floats(v) } } @@ -59,6 +65,7 @@ macro_rules! ds { #[cfg(test)] mod test { + use crate::datatype::NumericValue; use super::*; @@ -72,10 +79,11 @@ mod test { #[test] fn numeric_value_from_i64() { let n: NumericValue = 42i64.into(); - assert_eq!(n, NumericValue::BigInteger(42)); + assert_eq!(n, NumericValue::Integer(42)); } #[test] + #[should_panic] fn numeric_value_from_f32() { let n: NumericValue = 0.618f32.into(); assert_eq!(n, NumericValue::Float(0.618)); @@ -84,7 +92,7 @@ mod test { #[test] fn numeric_value_from_f64() { let n: NumericValue = 0.618f64.into(); - assert_eq!(n, NumericValue::BigFloat(0.618)); + assert_eq!(n, NumericValue::Float(0.618)); } #[test] @@ -101,8 +109,11 @@ mod test { #[test] fn data_frame_from_integers() { - let ds: DataSource = vec![vec![1, 2, 3], vec![4, 5, 6]].into(); - assert_eq!(ds, DataSource::Integers(vec![vec![1, 2, 3], vec![4, 5, 6]])); + let ds: DataSource = vec![vec![1i32, 2i32, 3i32], vec![4i32, 5i32, 6i32]].into(); + assert_eq!( + ds, + DataSource::Integers(vec![vec![1i64, 2i64, 3i64], vec![4i64, 5i64, 6i64]]) + ); } #[test] @@ -110,7 +121,7 @@ mod test { let ds: DataSource = vec![vec![1i64, 2i64, 3i64], vec![4i64, 5i64, 6i64]].into(); assert_eq!( ds, - DataSource::BigIntegers(vec![vec![1i64, 2i64, 3i64], vec![4i64, 5i64, 6i64]]) + DataSource::Integers(vec![vec![1i64, 2i64, 3i64], vec![4i64, 5i64, 6i64]]) ); } @@ -121,8 +132,8 @@ mod test { assert_eq!( ds, DataSource::Floats(vec![ - vec![1.0f32, 2.0f32, 3.0f32], - vec![4.0f32, 5.0f32, 6.0f32] + vec![1.0f64, 2.0f64, 3.0f64], + vec![4.0f64, 5.0f64, 6.0f64] ]) ); } @@ -133,7 +144,7 @@ mod test { vec![vec![1.0f64, 2.0f64, 3.0f64], vec![4.0f64, 5.0f64, 6.0f64]].into(); assert_eq!( ds, - DataSource::BigFloats(vec![ + DataSource::Floats(vec![ vec![1.0f64, 2.0f64, 3.0f64], vec![4.0f64, 5.0f64, 6.0f64] ]) diff --git a/charming/src/datatype/value.rs b/charming/src/datatype/value.rs index 93e1bd7..1f0f4dd 100644 --- a/charming/src/datatype/value.rs +++ b/charming/src/datatype/value.rs @@ -3,33 +3,31 @@ use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, PartialEq, PartialOrd, Serialize, Deserialize)] #[serde(untagged)] pub enum NumericValue { - Integer(i32), - BigInteger(i64), - Float(f32), - BigFloat(f64), + Integer(i64), + Float(f64), } impl From for NumericValue { fn from(n: i32) -> Self { - NumericValue::Integer(n) + NumericValue::Integer(n as i64) } } impl From for NumericValue { fn from(n: i64) -> Self { - NumericValue::BigInteger(n) + NumericValue::Integer(n) } } impl From for NumericValue { fn from(n: f32) -> Self { - NumericValue::Float(n) + NumericValue::Float(n as f64) } } impl From for NumericValue { fn from(n: f64) -> Self { - NumericValue::BigFloat(n) + NumericValue::Float(n) } }