sheeet-funcs 0.1.4

Sheeet! base functions crate.
Documentation
use wasm_bindgen::prelude::*;

pub mod prelude {
    pub use crate::add;
    pub use crate::avg;
    pub use crate::concat_with;
    pub use crate::div;
    pub use crate::med;
    pub use crate::mul;
    pub use crate::sub;
    pub use crate::sum;

    #[cfg(feature = "fetch")]
    pub use crate::fetch::fetch_get_json_path;
}

#[cfg(feature = "fetch")]
mod fetch;

#[wasm_bindgen]
pub fn add(a: f32, b: f32) -> f32 {
    a + b
}

#[wasm_bindgen]
pub fn sub(a: f32, b: f32) -> f32 {
    a - b
}

#[wasm_bindgen]
pub fn div(a: f32, b: f32) -> f32 {
    a / b
}

#[wasm_bindgen]
pub fn mul(a: f32, b: f32) -> f32 {
    a * b
}

#[wasm_bindgen]
pub fn pow(a: f32, n: f32) -> f32 {
    a.powf(n)
}

#[wasm_bindgen]
pub fn sum(vec: Vec<f32>) -> f32 {
    vec.into_iter().sum()
}

#[wasm_bindgen]
pub fn avg(vec: Vec<f32>) -> f32 {
    if vec.len() == 0 {
        return 0.0;
    }
    let len = vec.len() as f32;
    vec.into_iter().sum::<f32>() / len
}

/// Discrete implementation of median.
#[wasm_bindgen]
pub fn med(vec: Vec<f32>) -> f32 {
    if vec.len() == 0 {
        return 0.0;
    }
    vec.get(vec.len() / 2)
        .expect("expected median position to exist in the vector")
        .clone()
}

#[wasm_bindgen]
pub fn concat_with(vec: Vec<String>, sep: &str) -> String {
    let mut str = String::new();
    let len = vec.len();
    for (i, s) in vec.into_iter().enumerate() {
        str.push_str(&s);
        if i < len - 1 {
            str.push_str(sep);
        }
    }
    str
}

#[cfg(test)]
mod tests {
    use crate::*;

    #[test]
    fn test_avg() {
        assert_eq!(avg(vec![]), 0.0);
        assert_eq!(avg(vec![1.0, 2.0, 3.0]), 2.0);
        assert_eq!(avg(vec![1.0, 1.0, 7.0]), 3.0);
    }

    #[test]
    fn test_med() {
        assert_eq!(med(vec![]), 0.0);
        assert_eq!(med(vec![1.0, 2.0, 3.0, 4.0, 5.0]), 3.0);
        assert_eq!(med(vec![1.0, 1.0, 2.0, 2.0, 2.0]), 2.0);
        assert_eq!(med(vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0]), 4.0); // Discrete implementation.
    }

    #[test]
    fn test_concat_with() {
        assert_eq!(
            concat_with(
                vec![
                    "I".into(),
                    "want".into(),
                    "to".into(),
                    "join".into(),
                    "some".into(),
                    "text.".into()
                ],
                " "
            ),
            "I want to join some text."
        );
        assert_eq!(
            concat_with(vec!["w".into(), "o".into(), "r".into(), "d".into(),], ""),
            "word"
        );
        assert_eq!(
            concat_with(
                vec!["a".into(), "list".into(), "of".into(), "items".into(),],
                ", "
            ),
            "a, list, of, items"
        );
    }
}