docs: @SuppressWarnings({"UnusedDeclaration", "UnusedAssignment", "unchecked"})
      public static void main(String[] pArgs) {
          int howMany = 1000;
  
          if (pArgs.length > 0) {
              howMany = Integer.parseInt(pArgs[0]);
          }
          long start;
          long end;
  
          /*
        int[] intArr1 = new int[] {
          0, 1, 2, 3, 4, 5, 6, 7, 8, 9
        };
        int[] intArr2 = new int[] {
          10, 11, 12, 13, 14, 15, 16, 17, 18, 19
        };
        start = System.currentTimeMillis();
  
        for (int i = 0; i < howMany; i++) {
          intArr1 = (int[]) mergeArrays(intArr1, 0, intArr1.length, intArr2, 0, intArr2.length);
  
        }
        end = System.currentTimeMillis();
  
        System.out.println("mergeArrays: " + howMany + " * " + intArr2.length + "  ints took " + (end - start) + " milliseconds (" + intArr1.length
                           + ")");
      */
  
          ////////////////////////////////
          String[] stringArr1 = new String[]{
              "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"
          };
  
          /*
          String[] stringArr2 = new String[] {
            "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"
          };
  
          start = System.currentTimeMillis();
          for (int i = 0; i < howMany; i++) {
            stringArr1 = (String[]) mergeArrays(stringArr1, 0, stringArr1.length, stringArr2, 0, stringArr2.length);
  
          }
          end = System.currentTimeMillis();
          System.out.println("mergeArrays: " + howMany + " * " + stringArr2.length + "  Strings took " + (end - start) + " milliseconds ("
                             + stringArr1.length + ")");
  
  
            start   = System.currentTimeMillis();
            while (intArr1.length > stringArr2.length) {
              intArr1 = (int[]) subArray(intArr1, 0, intArr1.length - stringArr2.length);
  
            }
            end = System.currentTimeMillis();
  
            System.out.println("subArray: " + howMany + " * " + intArr2.length + "  ints took " + (end - start) + " milliseconds (" + intArr1.length
                               + ")");
  
            start = System.currentTimeMillis();
            while (stringArr1.length > stringArr2.length) {
              stringArr1 = (String[]) subArray(stringArr1, stringArr2.length);
  
            }
            end = System.currentTimeMillis();
            System.out.println("subArray: " + howMany + " * " + stringArr2.length + "  Strings took " + (end - start) + " milliseconds ("
                               + stringArr1.length + ")");
  
      */
          stringArr1 = new String[]{
              "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen",
              "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"
          };
          System.out.println("\nFilterIterators:\n");
          List list = Arrays.asList(stringArr1);
          Iterator iter = new FilterIterator(list.iterator(), new FilterIterator.Filter() {
  
              public boolean accept(Object pElement) {
                  return ((String) pElement).length() > 5;
              }
          });
  
          while (iter.hasNext()) {
              String str = (String) iter.next();
  
              System.out.println(str + " has more than 5 letters!");
          }
          iter = new FilterIterator(list.iterator(), new FilterIterator.Filter() {
  
              public boolean accept(Object pElement) {
                  return ((String) pElement).length() <= 5;
              }
          });
  
          while (iter.hasNext()) {
              String str = (String) iter.next();
  
              System.out.println(str + " has less than, or exactly 5 letters!");
          }
          start = System.currentTimeMillis();
  
          for (int i = 0; i < howMany; i++) {
              iter = new FilterIterator(list.iterator(), new FilterIterator.Filter() {
  
                  public boolean accept(Object pElement) {
                      return ((String) pElement).length() <= 5;
                  }
              });
              while (iter.hasNext()) {
                  iter.next();
                  System.out.print("");
              }
          }
  
  //        end = System.currentTimeMillis();
  //        System.out.println("Time: " + (end - start) + " ms");
  //        System.out.println("\nClosureCollection:\n");
  //        forEach(list, new Closure() {
  //
  //            public void execute(Object pElement) {
  //
  //                String str = (String) pElement;
  //
  //                if (str.length() > 5) {
  //                    System.out.println(str + " has more than 5 letters!");
  //                }
  //                else {
  //                    System.out.println(str + " has less than, or exactly 5 letters!");
  //                }
  //            }
  //        });
  //        start = System.currentTimeMillis();
  //        for (int i = 0; i < howMany; i++) {
  //            forEach(list, new Closure() {
  //
  //                public void execute(Object pElement) {
  //
  //                    String str = (String) pElement;
  //
  //                    if (str.length() <= 5) {
  //                        System.out.print("");
  //                    }
  //                }
  //            });
  //        }
  //        end = System.currentTimeMillis();
  //        System.out.println("Time: " + (end - start) + " ms");
      }