sheeet_funcs/
lib.rs

1use wasm_bindgen::prelude::*;
2
3pub mod prelude {
4    pub use crate::add;
5    pub use crate::avg;
6    pub use crate::concat_with;
7    pub use crate::div;
8    pub use crate::med;
9    pub use crate::mul;
10    pub use crate::sub;
11    pub use crate::sum;
12}
13
14#[wasm_bindgen]
15pub fn add(a: f64, b: f64) -> f64 {
16    a + b
17}
18
19#[wasm_bindgen]
20pub fn sub(a: f64, b: f64) -> f64 {
21    a - b
22}
23
24#[wasm_bindgen]
25pub fn div(a: f64, b: f64) -> f64 {
26    a / b
27}
28
29#[wasm_bindgen]
30pub fn mul(a: f64, b: f64) -> f64 {
31    a * b
32}
33
34#[wasm_bindgen]
35pub fn pow(a: f64, n: f64) -> f64 {
36    a.powf(n)
37}
38
39#[wasm_bindgen]
40pub fn sum(vec: Vec<f64>) -> f64 {
41    vec.into_iter().sum()
42}
43
44#[wasm_bindgen]
45pub fn avg(vec: Vec<f64>) -> f64 {
46    if vec.len() == 0 {
47        return 0.0;
48    }
49    let len = vec.len() as f64;
50    vec.into_iter().sum::<f64>() / len
51}
52
53/// Discrete implementation of median.
54#[wasm_bindgen]
55pub fn med(vec: Vec<f64>) -> f64 {
56    if vec.len() == 0 {
57        return 0.0;
58    }
59    vec.get(vec.len() / 2)
60        .expect("expected median position to exist in the vector")
61        .clone()
62}
63
64#[wasm_bindgen]
65pub fn concat_with(vec: Vec<String>, sep: &str) -> String {
66    let mut str = String::new();
67    let len = vec.len();
68    for (i, s) in vec.into_iter().enumerate() {
69        str.push_str(&s);
70        if i < len - 1 {
71            str.push_str(sep);
72        }
73    }
74    str
75}
76
77#[cfg(test)]
78mod tests {
79    use crate::*;
80
81    #[test]
82    fn test_avg() {
83        assert_eq!(avg(vec![]), 0.0);
84        assert_eq!(avg(vec![1.0, 2.0, 3.0]), 2.0);
85        assert_eq!(avg(vec![1.0, 1.0, 7.0]), 3.0);
86    }
87
88    #[test]
89    fn test_med() {
90        assert_eq!(med(vec![]), 0.0);
91        assert_eq!(med(vec![1.0, 2.0, 3.0, 4.0, 5.0]), 3.0);
92        assert_eq!(med(vec![1.0, 1.0, 2.0, 2.0, 2.0]), 2.0);
93        assert_eq!(med(vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0]), 4.0); // Discrete implementation.
94    }
95
96    #[test]
97    fn test_concat_with() {
98        assert_eq!(
99            concat_with(
100                vec![
101                    "I".into(),
102                    "want".into(),
103                    "to".into(),
104                    "join".into(),
105                    "some".into(),
106                    "text.".into()
107                ],
108                " "
109            ),
110            "I want to join some text."
111        );
112        assert_eq!(
113            concat_with(vec!["w".into(), "o".into(), "r".into(), "d".into(),], ""),
114            "word"
115        );
116        assert_eq!(
117            concat_with(
118                vec!["a".into(), "list".into(), "of".into(), "items".into(),],
119                ", "
120            ),
121            "a, list, of, items"
122        );
123    }
124}