import java.util.Iterator;
import java.util.HashSet;
/**
 * Domain adds universal and existential quantifiers to HashSet
 */
public class Domain extends HashSet {
  
  /**
   * forAll universally quantifies p
   * @param p predicate universally quantified
   * @return true iff p(x) true for all x in this
   */
  public boolean forAll(Predicate p) {
    boolean bigAnd = true;
    Iterator element = iterator();
    
    // iterate until empty or counterexample found
    while (bigAnd && element.hasNext()) {
      bigAnd = p.of(element.next());
    }
    return bigAnd;
  }
  
  /**
   * exists existentially quantifies p
   * @param p predicate existentially quantified
   * @return true iff p(x) true for some x in this
   */
  public boolean exists(Predicate p) {
    boolean bigOr = false;
    Iterator element = iterator();
    
    //iterate until empty or example found
    while (!bigOr && element.hasNext()) { 
      bigOr = p.of(element.next());
    }
    return bigOr;
  }
  
}
