// Path: src/main/java/net/tradelib/functors/Ema.java
// public class Ema implements IMovingAverage {
//    private final int n;
//    private final double dn;
//    private double previous;
//    private int count;
//    private final double k;
//    
//    public Ema(int n) {
//       this.previous = 0.0;
//       this.count = 0;
//       this.n = n;
//       this.dn = n;
//       this.k = 2.0 / (this.dn + 1.0);
//    }
//    
//    public Ema(int n, boolean wilder) {
//       this.previous = 0.0;
//       this.count = 0;
//       this.n = n;
//       this.dn = n;
//       if(wilder) {
//          this.k = 1.0 / dn;
//       } else {
//          this.k = 2.0 / (this.dn + 1.0);
//       }
//    }
//    
//    public int getLength() { return n; }
//    public int getCount() { return count; }
//    
//    public double add(double value) {
//       ++count;
//       if(count > n) {
//          previous = value * k + previous * (1.0 - k); 
//       } else if(count == n) {
//          previous = (previous + value) / dn;
//       } else {
//          previous += value;
//       }
//       return last();
//    }
//    
//    public double last() { return count < n ? Double.NaN : previous; }
// }


import static org.junit.Assert.*;
import net.tradelib.functors.Ema;
import org.junit.Test;
// Copyright 2015 by Ivan Popivanov
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package net.tradelib.functors;



public class EmaTest {

   @Test
   public void test() {
      String [] inputs = {"124.41","125.34","125.68","125.92","127.32","129.32","131.65","131.39","129.65","131.07",
            "131.82","131.82","132.82","134.91","133.19","134.96","133.4","132.92","134.77","134.36"};
      String [] expected = {null,null,null,null,null,null,null,null,null,"128.175","128.837727","129.379959",
            "130.005421","130.897162","131.314042","131.976943","132.235681","132.360103","132.798266","133.082217"};
// Path: src/main/java/net/tradelib/functors/Ema.java
// public class Ema implements IMovingAverage {
//    private final int n;
//    private final double dn;
//    private double previous;
//    private int count;
//    private final double k;
//    
//    public Ema(int n) {
//       this.previous = 0.0;
//       this.count = 0;
//       this.n = n;
//       this.dn = n;
//       this.k = 2.0 / (this.dn + 1.0);
//    }
//    
//    public Ema(int n, boolean wilder) {
//       this.previous = 0.0;
//       this.count = 0;
//       this.n = n;
//       this.dn = n;
//       if(wilder) {
//          this.k = 1.0 / dn;
//       } else {
//          this.k = 2.0 / (this.dn + 1.0);
//       }
//    }
//    
//    public int getLength() { return n; }
//    public int getCount() { return count; }
//    
//    public double add(double value) {
//       ++count;
//       if(count > n) {
//          previous = value * k + previous * (1.0 - k); 
//       } else if(count == n) {
//          previous = (previous + value) / dn;
//       } else {
//          previous += value;
//       }
//       return last();
//    }
//    
//    public double last() { return count < n ? Double.NaN : previous; }
// }


// Path: src/test/java/net/tradelib/functors/EmaTest.java
import static org.junit.Assert.*;
import net.tradelib.functors.Ema;
import org.junit.Test;

// Copyright 2015 by Ivan Popivanov
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package net.tradelib.functors;



public class EmaTest {

   @Test
   public void test() {
      String [] inputs = {"124.41","125.34","125.68","125.92","127.32","129.32","131.65","131.39","129.65","131.07",
            "131.82","131.82","132.82","134.91","133.19","134.96","133.4","132.92","134.77","134.36"};
      String [] expected = {null,null,null,null,null,null,null,null,null,"128.175","128.837727","129.379959",
            "130.005421","130.897162","131.314042","131.976943","132.235681","132.360103","132.798266","133.082217"};
      Ema ema = new Ema(10);