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