1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
extern crate mech_core;
extern crate mech_utilities;
use mech_core::{Interner, Transaction};
use mech_core::{Value, Table};
use mech_core::{Quantity, ToQuantity, QuantityMath, make_quantity};

#[no_mangle]
pub extern "C" fn stats_average(input: Vec<(String, Table)>) -> Table {
  let (argument, table_ref) = &input[0];
  let out = if argument == "row" {
    let mut out = Table::new(0,table_ref.rows,1);
    for i in 0..table_ref.rows as usize {
      let mut value = 0.0;
      for j in 0..table_ref.columns as usize {
        value = value + &table_ref.data[j][i].as_float().unwrap();
      }
      out.data[0][i] = Value::from_quantity((value / table_ref.columns as f64).to_quantity());
    }
    out
  } else if argument == "column" {
    let mut out = Table::new(0,1,table_ref.columns);
    for i in 0..table_ref.columns as usize {
      let mut value = 0.0;
      for j in 0..table_ref.rows as usize {
        value = value + &table_ref.data[i][j].as_float().unwrap();
      }
      out.data[i][0] = Value::from_quantity((value / table_ref.rows as f64).to_quantity());
    }
    out
  } else if argument == "table" {
    let mut out = Table::new(0,1,1);
    let mut value = 0.0;
    for i in 0..table_ref.columns as usize {
      for j in 0..table_ref.rows as usize {
        value = value + &table_ref.data[i][j].as_float().unwrap();
      }
      out.data[0][0] = Value::from_quantity((value / (table_ref.rows * table_ref.columns) as f64).to_quantity());
    }
    out
  } else {
    Table::new(0,1, 1)
  };
  out 
}