
// SetUtilsTester.java
// https://www.baeldung.com/apache-commons-setutils
// Andrew Davison, ad@coe.psu.ac.th, May 2023

/* SetUtils features:
     * set operations which return new sets
     * predicatedSet
     * transformedSet
     * orderedSet

   Also see MultiSetTester.java, BagTester.java

  Usage:
    > compile SetUtilsTester.java
    > run SetUtilsTester
*/

import java.util.*;

import org.apache.commons.collections4.*;
import org.apache.commons.collections4.set.*;



public class SetUtilsTester
{

  public static void main(String[] args) 
  {
    Set<Integer> a = new HashSet<>(Arrays.asList(1, 2, 5));
    System.out.println("Set a: " + a);
    Set<Integer> b = new HashSet<>(Arrays.asList(1, 2, 7));
    System.out.println("Set b: " + b);

    SetUtils.SetView<Integer> diff = SetUtils.difference(a, b);
    System.out.println("Difference a-b: " + diff);

    SetUtils.SetView<Integer> union = SetUtils.union(a, b);
    System.out.println("Union: " + union);

    SetUtils.SetView<Integer> intersect = SetUtils.intersection(a, b);
    System.out.println("Intersection: " + intersect);

    SetUtils.SetView<Integer> disj = SetUtils.disjunction(a, b);
    System.out.println("Disjunction: " + disj);

    // ---------------------------------

    Set<String> lset = SetUtils.predicatedSet(new HashSet<>(), 
                                         (s -> s.startsWith("L")));
    System.out.println("\nBuilding predicated set ( names start with 'L')");
    lset.add("London");
    lset.add("Luton");

    try {  lset.add("Manchester");  }
    catch(IllegalArgumentException e)
    {  System.out.println(e);  }

    System.out.println("Result: " + lset);

    // ---------------------------------

    Set<Integer> trans = SetUtils.transformedSet(
                                    new HashSet<>(), (e ->e * 2));
    System.out.println("\nAdding 2 and 5 to transforming set (*2)");
    trans.add(2);
    trans.add(5);
    System.out.println("Result: " + trans);

    // ---------------------------------

    Set<Integer> set = new HashSet<>(Arrays.asList(10, 1, 5));
    System.out.println("\n(10, 1, 5) set: " + set);

    Set<Integer> orderedSet = SetUtils.orderedSet(new HashSet<>());
    orderedSet.addAll(Arrays.asList(10, 1, 5));
    System.out.println("Added order: " + orderedSet);

  }  // end of main()

}  // end of SetUtilsTester class