001package org.hl7.fhir.utilities;
002
003import java.util.ArrayList;
004import java.util.List;
005
006import org.hl7.fhir.utilities.MergedList.MergeNode;
007
008/**
009 * A list of items that represent 
010 * @author graha
011 *
012 * @param <T>
013 */
014public class MergedList<T> extends ArrayList<MergeNode<T>> {
015
016  private static final long serialVersionUID = 1L;
017  
018  public static interface IMatcher<T1> {
019    public boolean match(T1 l, T1 r);
020  }
021  
022  public static class MergeNode<T1> {
023    private T1 left;
024    private T1 right;
025    public MergeNode(T1 left, T1 right) {
026      super();
027      this.left = left;
028      this.right = right;
029    }
030    public T1 getLeft() {
031      return left;
032    }
033    public T1 getRight() {
034      return right;
035    }
036
037    public boolean hasLeft() {
038      return left != null;
039    }
040
041    public boolean hasRight() {
042      return right != null;
043    }
044    @Override
045    public String toString() {
046      return (hasLeft() ? left.toString() : "null") + " :: "+(hasRight() ? right.toString() : "null");
047    }
048  }
049
050  public MergedList(List<T> left, List<T> right, IMatcher<T> matcher) {
051    super();
052    List<T> m = new ArrayList<>();
053    for (T l : left) {
054      T t = null;
055      for (T r : right) {
056        if (matcher.match(l, r)) {
057          t = r;
058          m.add(r);
059          break;
060        }
061      }
062      this.add(new MergeNode<T>(l, t));
063    }
064    for (T r : right) {
065      if (!m.contains(r)) {
066        this.add(new MergeNode<T>(null, r));
067      }
068    }
069  }
070
071  public MergedList(List<T> left, List<T> right) {
072    super();
073    for (int i = 0; i < Integer.max(left.size(), right.size()); i++) {
074      T l = i < left.size() ? left.get(i) : null;
075      T r = i < right.size() ? right.get(i) : null;
076      this.add(new MergeNode<T>(l, r));
077    }
078  }
079
080}