package commons.collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
 * Helper. Stores a set of pairs. Two usages: a) Handle (a,b) as equal to (b,a): use isNewMutually
 * b) Handle (a,b) as a different pair than (b,a). use isNew(a,b)
 * @author ks
 */
public class PairSet<T>
{

Map<T, Set<T>> omap = new HashMap<T, Set<T>>();

public boolean isNew (T a, T b)
{
   Set<T> imap = null;
   if (!omap.containsKey(a))
   {
      imap = new HashSet<T>();
      imap.add(b);
      omap.put(a, imap);
      return true;
   }
   imap = omap.get(a);
   if (!imap.contains(b))
   {
      imap.add(b);
      omap.put(a, imap);
      return true;
   }
   return false;
}

public void clear ()
{
   omap.clear();
}

public boolean isNewMutually (T a, T b)
{
   Set<T> imap = null;
   if (omap.containsKey(a) || omap.containsKey(b))
   {
      if ((omap.containsKey(a) && omap.get(a).contains(b)) || (omap.containsKey(b) && omap.get(b).contains(a))) return false;
      if (omap.containsKey(a))
      {
         imap = omap.get(a);
         imap.add(b);
         omap.put(a, imap);
         return true;
      }
      if (omap.containsKey(b))
      {
         imap = omap.get(b);
         imap.add(a);
         omap.put(a, imap);
         return true;
      }
   }
   imap = new HashSet<T>();
   imap.add(b);
   omap.put(a, imap);
   return true;
}

public boolean contains (T a, T b)
{
   if (!omap.containsKey(a)) return false;
   Set<T> imap = omap.get(a);
   if (!imap.contains(b)) return false;
   return true;
}
}
