
package de.ivu.elect.business.sitzberechnung.control.varianten;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Nullable;

public abstract class AbstractVergleicher<E> {

  protected int anzahlVerglichenerWerte = 0;

  protected List<E> werte = new ArrayList<>();

  protected AbstractVergleicher() {
    super();
  }

  protected void addWert(E neuerWert) {
    anzahlVerglichenerWerte++;

    for (E alterWert : werte) {
      if (isGleich(alterWert, neuerWert)) {
        return;
      }
    }

    werte.add(neuerWert);
  }

  abstract boolean isGleich(E alterWert, E neuerWert);

  /**
   * Fasst die gesammelten Werte sinnvoll zusammen. Im ersten Wurf ist das <code>null</code>, falls die Werte nicht eindeutig sind...
   */
  @Nullable
  public E getMergedValue(int erwarteteAnzahlVerglichenerWerte) {
    if (this.anzahlVerglichenerWerte == erwarteteAnzahlVerglichenerWerte && werte.size() == 1) {
      return werte.iterator().next();
    }

    return null;
  }
}
