code: public static <T> ISeq<T> front(
  		final Seq<? extends T> set,
  		final Comparator<? super T> dominance
  	) {
  		final MSeq<T> front = MSeq.of(set);
  
  		int n = front.size();
  		int i = 0;
  		while (i < n) {
  			int j = i + 1;
  			while (j < n) {
  				if (dominance.compare(front.get(i), front.get(j)) > 0) {
  					--n;
  					front.swap(j, n);
  				} else if (dominance.compare(front.get(j), front.get(i)) > 0) {
  					--n;
  					front.swap(i, n);
  					--i;
  					break;
  				} else {
  					++j;
  				}
  			}
  			++i;
  		}
  
  		return front.subSeq(0, n).copy().toISeq();
  	}
docs: Return the elements, from the given input {@code set}, which are part of
  the pareto front.
  <p>
  <b>Reference:</b><em>
  E. Zitzler and L. Thiele.
  Multiobjective Evolutionary Algorithms: A Comparative Case Study
  and the Strength Pareto Approach,
  IEEE Transactions on Evolutionary Computation, vol. 3, no. 4,
  pp. 257-271, 1999.</em>
  
  @param set the input set
  @param dominance the dominance comparator used
  @param <T> the element type
  @return the elements which are part of the pareto set
  @throws NullPointerException if one of the arguments is {@code null}