Skip to main content

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