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#[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); }
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}