use error::Err;
pub fn ema(data: &[f64], period: usize) -> Result<Vec<f64>, Err> {
if period > data.len() {
return Err(Err::NotEnoughtData);
}
let mut ema = Vec::new();
let mut j = 1;
let sma = (data[0..period]).iter().sum::<f64>() / period as f64;
let multiplier: f64 = 2.0 / (1.0 + period as f64);
ema.push(sma);
ema.push(((data[period] - sma) * multiplier) + sma);
for i in &data[period + 1..data.len()] {
let tmp = ((*i - ema[j]) * multiplier) + ema[j];
j = j + 1;
ema.push(tmp);
}
Ok(ema)
}