diff --git a/src/main/java/forge/quest/gui/QuestWinLoseHandler.java b/src/main/java/forge/quest/gui/QuestWinLoseHandler.java index 557ba9db811..74f651f00ee 100644 --- a/src/main/java/forge/quest/gui/QuestWinLoseHandler.java +++ b/src/main/java/forge/quest/gui/QuestWinLoseHandler.java @@ -34,7 +34,6 @@ import forge.quest.gui.main.QuestChallenge; import forge.quest.gui.main.QuestEvent; import forge.view.swing.WinLoseModeHandler; -// TODO: Auto-generated Javadoc /** *

* QuestWinLoseHandler. diff --git a/src/main/java/forge/view/swing/WinLoseModeHandler.java b/src/main/java/forge/view/swing/WinLoseModeHandler.java index e590fc5a73a..1e87b0693aa 100644 --- a/src/main/java/forge/view/swing/WinLoseModeHandler.java +++ b/src/main/java/forge/view/swing/WinLoseModeHandler.java @@ -37,7 +37,7 @@ public class WinLoseModeHandler { * Action performed when "quit" button is pressed in default win/lose UI. * */ - public final void actionOnQuit() { + public void actionOnQuit() { if (System.getenv("NG2") != null) { if (System.getenv("NG2").equalsIgnoreCase("true")) { String[] argz = {}; @@ -69,7 +69,7 @@ public class WinLoseModeHandler { * with other game modes. * */ - public final void startNextRound() { + public void startNextRound() { AllZone.getGameAction().newGame(Constant.Runtime.HumanDeck[0], Constant.Runtime.ComputerDeck[0]); } @@ -82,7 +82,7 @@ public class WinLoseModeHandler { * * @return true, if successful */ - public final boolean populateCustomPanel() { + public boolean populateCustomPanel() { return false; } diff --git a/src/main/java/net/slightlymagic/braids/util/ClumsyRunnable.java b/src/main/java/net/slightlymagic/braids/util/ClumsyRunnable.java index cbd4e55e154..3525c937ab3 100644 --- a/src/main/java/net/slightlymagic/braids/util/ClumsyRunnable.java +++ b/src/main/java/net/slightlymagic/braids/util/ClumsyRunnable.java @@ -4,5 +4,12 @@ package net.slightlymagic.braids.util; * Like Runnable, but it can throw any Exception. */ public interface ClumsyRunnable { - public void run() throws Exception; + + /** + * Run. + * + * @throws Exception + * the exception + */ + void run() throws Exception; } diff --git a/src/main/java/net/slightlymagic/braids/util/ImmutableIterableFrom.java b/src/main/java/net/slightlymagic/braids/util/ImmutableIterableFrom.java index 329b065fcbf..396dde98ddd 100644 --- a/src/main/java/net/slightlymagic/braids/util/ImmutableIterableFrom.java +++ b/src/main/java/net/slightlymagic/braids/util/ImmutableIterableFrom.java @@ -5,56 +5,66 @@ import java.util.Iterator; /** * Acts as both immutable Iterator and Iterable; remove method always throws * exception. + * + * @param + * the generic type */ public class ImmutableIterableFrom implements Iterable, Iterator { - private Iterator iterator; + private Iterator iterator; - /** - * Wrap an iterable so that it cannot be changed via - * the remove method. - * - * @param iterable the iterable to wrap - */ - public ImmutableIterableFrom(Iterable iterable) { - this.iterator = iterable.iterator(); - } + /** + * Wrap an iterable so that it cannot be changed via the remove method. + * + * @param iterable + * the iterable to wrap + */ + public ImmutableIterableFrom(final Iterable iterable) { + this.iterator = iterable.iterator(); + } - /** - * Wrap an iterator so that its container cannot be changed via - * the remove method. - * - * @param iterator the iterator to wrap - */ - public ImmutableIterableFrom(Iterator iterator) { - this.iterator = iterator; - } + /** + * Wrap an iterator so that its container cannot be changed via the remove + * method. + * + * @param iterator + * the iterator to wrap + */ + public ImmutableIterableFrom(final Iterator iterator) { + this.iterator = iterator; + } - /** - * This class acts as both an Iterable and an Iterator. - */ - public Iterator iterator() { - return this; - } + /** + * This class acts as both an Iterable and an Iterator. + * + * @return the iterator + */ + public final Iterator iterator() { + return this; + } - /** - * Returns hasNext from the wrapped [object's] iterator. - */ - public boolean hasNext() { - return iterator.hasNext(); - } + /** + * Returns hasNext from the wrapped [object's] iterator. + * + * @return true, if successful + */ + public final boolean hasNext() { + return iterator.hasNext(); + } - /** - * Returns next from the wrapped [object's] iterator. - */ - public T next() { - return iterator.next(); - } + /** + * Returns next from the wrapped [object's] iterator. + * + * @return the t + */ + public final T next() { + return iterator.next(); + } - /** - * Never succeeeds. - * @throws UnsupportedOperationException always. - */ - public void remove() { - throw new UnsupportedOperationException(); - } + /** + * Never succeeeds. + * + */ + public final void remove() { + throw new UnsupportedOperationException(); + } } diff --git a/src/main/java/net/slightlymagic/braids/util/NotImplementedError.java b/src/main/java/net/slightlymagic/braids/util/NotImplementedError.java index 1b426417bad..7b3d2564d67 100644 --- a/src/main/java/net/slightlymagic/braids/util/NotImplementedError.java +++ b/src/main/java/net/slightlymagic/braids/util/NotImplementedError.java @@ -4,7 +4,7 @@ package net.slightlymagic.braids.util; * This exception indicates the particular method (or part of a method) being * called has not been implemented; getting this exception is generally * considered a programming error. - * + * * Throwing this exception does not necessarily mean the method will be * implemented at any point in the future. */ @@ -22,10 +22,11 @@ public class NotImplementedError extends RuntimeException { /** * Indicates what has not been implemented. - * - * @param message indicates what exactly has not been implemented. - * May include information about future plans to implement the described - * section of code. + * + * @param message + * indicates what exactly has not been implemented. May include + * information about future plans to implement the described + * section of code. */ public NotImplementedError(final String message) { super(message); @@ -33,9 +34,10 @@ public class NotImplementedError extends RuntimeException { /** * Like the no-arg constructor, but with a cause parameter. - * - * @param cause the exception that caused this one to be thrown - * + * + * @param cause + * the exception that caused this one to be thrown + * * @see #NotImplementedError() */ public NotImplementedError(final Throwable cause) { @@ -44,13 +46,15 @@ public class NotImplementedError extends RuntimeException { /** * Like the String constructor, but with a cause parameter. - * - * @param message indicates what exactly has not been implemented. - * May include information about future plans to implement the described - * section of code. - * - * @param cause the exception that caused this one to be thrown - * + * + * @param message + * indicates what exactly has not been implemented. May include + * information about future plans to implement the described + * section of code. + * + * @param cause + * the exception that caused this one to be thrown + * * @see #NotImplementedError(String) */ public NotImplementedError(final String message, final Throwable cause) { diff --git a/src/main/java/net/slightlymagic/braids/util/UtilFunctions.java b/src/main/java/net/slightlymagic/braids/util/UtilFunctions.java index 6784db0ea22..1874c1976a1 100644 --- a/src/main/java/net/slightlymagic/braids/util/UtilFunctions.java +++ b/src/main/java/net/slightlymagic/braids/util/UtilFunctions.java @@ -19,12 +19,13 @@ public final class UtilFunctions { // empty } - /** * Throws a NullPointerException if param is null. - * - * @param paramName the name of the parameter; may be null - * @param param the parameter to test + * + * @param paramName + * the name of the parameter; may be null + * @param param + * the parameter to test */ public static void checkNotNull(final String paramName, final Object param) { if (param != null) { @@ -34,10 +35,16 @@ public final class UtilFunctions { NullPointerException exn = null; if (paramName == null) { - exn = new NullPointerException(); // NOPMD by Braids on 8/18/11 11:19 PM - } - else { - exn = new NullPointerException(paramName + " must not be null"); // NOPMD by Braids on 8/18/11 11:19 PM + exn = new NullPointerException(); // NOPMD by Braids on 8/18/11 + // 11:19 PM + } else { + exn = new NullPointerException(paramName + " must not be null"); // NOPMD + // by + // Braids + // on + // 8/18/11 + // 11:19 + // PM } // Doctor the exception to appear to come from the caller. @@ -48,43 +55,52 @@ public final class UtilFunctions { } /** - * Invoke the given Runnable in an Event Dispatch Thread and wait for it - * to finish; but try to use SwingUtilities.invokeLater instead whenever + * Invoke the given Runnable in an Event Dispatch Thread and wait for it to + * finish; but try to use SwingUtilities.invokeLater instead whenever * feasible. - * + * * Exceptions generated by SwingUtilities.invokeAndWait (if used), are * rethrown as RuntimeExceptions. - * + * + * @param proc + * the Runnable to run * @see javax.swing.SwingUtilities#invokeLater(Runnable) - * - * @param proc the Runnable to run */ - public static void invokeInEventDispatchThreadAndWait(final Runnable proc) { // NOPMD by Braids on 8/18/11 11:19 PM + public static void invokeInEventDispatchThreadAndWait(final Runnable proc) { // NOPMD + // by + // Braids + // on + // 8/18/11 + // 11:19 + // PM if (SwingUtilities.isEventDispatchThread()) { // Just run in the current thread. proc.run(); - } - else { + } else { try { SwingUtilities.invokeAndWait(proc); } catch (InterruptedException exn) { - throw new RuntimeException(exn); // NOPMD by Braids on 8/18/11 11:19 PM + throw new RuntimeException(exn); // NOPMD by Braids on 8/18/11 + // 11:19 PM } catch (InvocationTargetException exn) { - throw new RuntimeException(exn); // NOPMD by Braids on 8/18/11 11:19 PM + throw new RuntimeException(exn); // NOPMD by Braids on 8/18/11 + // 11:19 PM } } } /** - * Create an array from the (rest of) an iterator's output; - * this function is horribly inefficient. - * + * Create an array from the (rest of) an iterator's output; this function is + * horribly inefficient. + * * Please, only use it on small iterators. - * - * @param (inferred automatically) - * - * @param iter the iterator to traverse - * + * + * @param + * (inferred automatically) + * + * @param iter + * the iterator to traverse + * * @return an array of (the rest of) the iterator's values */ public static T[] iteratorToArray(final Iterator iter) { @@ -101,27 +117,28 @@ public final class UtilFunctions { return result; } - /** * Returns the rightmost portion of an array, Python-style. - * - * @param (inferred automatically) - * - * @param dstArray the array in which to place new items - * - * @param srcArray the array to copy (shallowly) - * - * @param startIndexIn if positive, the index (from the left) at which to - * start copying; if negative, we treat this as the index from the right. - * For example, calling this with startIndex = -2 returns the last two - * items in the array, if it has that many. - * + * + * @param + * (inferred automatically) + * + * @param dstArray + * the array in which to place new items + * + * @param srcArray + * the array to copy (shallowly) + * + * @param startIndexIn + * if positive, the index (from the left) at which to start + * copying; if negative, we treat this as the index from the + * right. For example, calling this with startIndex = -2 returns + * the last two items in the array, if it has that many. + * * @return a shallow copy of array starting at startIndex; this may return * an empty array if the startIndex is out of bounds. */ - public static T[] slice(final T[] dstArray, final T[] srcArray, - final int startIndexIn) - { + public static T[] slice(final T[] dstArray, final T[] srcArray, final int startIndexIn) { int startIndex = startIndexIn; if (startIndex < 0) { startIndex = srcArray.length + startIndex; @@ -131,55 +148,51 @@ public final class UtilFunctions { } if (dstArray == null) { - throw new NullPointerException(); // NOPMD by Braids on 8/18/11 11:19 PM + throw new NullPointerException(); // NOPMD by Braids on 8/18/11 + // 11:19 PM } if (srcArray == null) { - throw new NullPointerException(); // NOPMD by Braids on 8/18/11 11:19 PM + throw new NullPointerException(); // NOPMD by Braids on 8/18/11 + // 11:19 PM } final int resultLength = getSliceLength(srcArray, startIndex); if (dstArray.length != resultLength) { - throw new ArrayIndexOutOfBoundsException( - "First parameter must have length " + resultLength + throw new ArrayIndexOutOfBoundsException("First parameter must have length " + resultLength + ", but length is " + dstArray.length + "."); } int srcIx = startIndex; - for (int dstIx = 0; - dstIx < resultLength && srcIx < srcArray.length; - dstIx++, srcIx++) - { + for (int dstIx = 0; dstIx < resultLength && srcIx < srcArray.length; dstIx++, srcIx++) { dstArray[dstIx] = srcArray[srcIx]; } return dstArray; } - /** * Get a slice's length in preparation for taking a slice. - * - * I do not like the fact that I have to use this function, but - * Java left me with little choice. - * - * @see #slice(Object[], Object[], int) - * - * @param (inferred automatically) - * - * @param srcArray the array that would be copied (shallowly) - * - * @param startIndexIn if positive, the index (from the left) at which - * copying would start; if negative, we treat this as the index from the - * right. For example, calling this with startIndex = -2 computes the - * length if slice would return the last two items in the array, if it has - * that many. - * + * + * I do not like the fact that I have to use this function, but Java left me + * with little choice. + * + * @param + * (inferred automatically) + * @param srcArray + * the array that would be copied (shallowly) + * @param startIndexIn + * if positive, the index (from the left) at which copying would + * start; if negative, we treat this as the index from the right. + * For example, calling this with startIndex = -2 computes the + * length if slice would return the last two items in the array, + * if it has that many. * @return the length of the array that would result from calling - * slice(Object[], Object[], int) with the given srcArray and - * startIndex. + * slice(Object[], Object[], int) with the given srcArray and + * startIndex. + * @see #slice(Object[], Object[], int) */ public static int getSliceLength(final T[] srcArray, final int startIndexIn) { int startIndex = startIndexIn; @@ -195,34 +208,43 @@ public final class UtilFunctions { return resultLength; } - /** * Handles the boilerplate null and isinstance check for an equals method. - * + * * Example: + * *

      * public boolean equals(Object obj) {
      *     MyClassName that = checkNullOrNotInstance(this, obj);
      *     if (that == null) {
      *         return false;
      *     }
-     *     //...
+     *     // ...
      * }
      * 
- * - * @param (inferred automatically) - * - * @param goodInstance a non-null instance of type T; looks neater than - * passing in goodInstance.getClass() - * - * @param obj the object to test - * - * @return null if obj is null or not an instance of goodInstance's class; - * otherwise, we return obj cast to goodInstance's type + * + * @param + * (inferred automatically) + * + * @param goodInstance + * a non-null instance of type T; looks neater than passing in + * goodInstance.getClass() + * + * @param obj + * the object to test + * + * @return null if obj is null or not an instance of goodInstance's class; + * otherwise, we return obj cast to goodInstance's type */ public static T checkNullOrNotInstance(final T goodInstance, final Object obj) { if (goodInstance == null) { - throw new NullPointerException("first parameter must not be null"); // NOPMD by Braids on 8/18/11 11:19 PM + throw new NullPointerException("first parameter must not be null"); // NOPMD + // by + // Braids + // on + // 8/18/11 + // 11:19 + // PM } @SuppressWarnings("unchecked") @@ -246,13 +268,12 @@ public final class UtilFunctions { return result; } - - /** * Safely converts an object to a String. - * - * @param obj to convert; may be null - * + * + * @param obj + * to convert; may be null + * * @return "null" if obj is null, obj.toString() otherwise */ public static String safeToString(final Object obj) { @@ -260,8 +281,7 @@ public final class UtilFunctions { if (obj == null) { result = "null"; - } - else { + } else { result = obj.toString(); } @@ -270,33 +290,33 @@ public final class UtilFunctions { /** * Remove nulls and duplicate items from the list. - * + * * This may change the list's ordering. It uses the items' equals methods to * determine equality. - * + * * Advantages over HashSet: This consumes no unnecessary heap-memory, nor - * does it require objects to implement hashCode. It is OK if - * (o1.equals(o2) does not imply o1.hashCode() == o2.hashCode()). - * + * does it require objects to implement hashCode. It is OK if (o1.equals(o2) + * does not imply o1.hashCode() == o2.hashCode()). + * * Advantages over TreeSet: This does not require a comparator. - * - * Disadvantages over HashSet and TreeSet: This runs in O(n*n) time. - * - * @param (inferred automatically) - * - * @param list the list to modify; this is fastest with ArrayList. + * + * Disadvantages over HashSet and TreeSet: This runs in O(n*n) time. + * + * @param + * (inferred automatically) + * + * @param list + * the list to modify; this is fastest with ArrayList. */ public static void smartRemoveDuplicatesAndNulls(final List list) { // Get rid of pesky leading nulls. smartRemoveDuplicatesAndNullsHelper(list, 0, null); for (int earlierIx = 0; earlierIx < list.size(); earlierIx++) { - for (int laterIx = earlierIx + 1; laterIx < list.size(); laterIx++) - { + for (int laterIx = earlierIx + 1; laterIx < list.size(); laterIx++) { final T itemAtEarlierIx = list.get(earlierIx); - smartRemoveDuplicatesAndNullsHelper(list, laterIx, - itemAtEarlierIx); + smartRemoveDuplicatesAndNullsHelper(list, laterIx, itemAtEarlierIx); } } @@ -304,28 +324,25 @@ public final class UtilFunctions { /** * Helper method for smartRemoveDuplicatesAndNulls that is subject to - * change; if you call this directly, you do so at your own risk! - * - * @param (inferred automatically) - * - * @param list the list to modify; if all items from startIx to the end - * are either null or equal to objSeenPreviously, then we truncate the - * list just before startIx. - * - * @param startIx the index to examine; we only move items within the range - * of [startIx, list.size()-1]. - * - * @param objSeenPreviously the object with which to compare list[startIx]; - * may be null. + * change; if you call this directly, you do so at your own risk!. + * + * @param + * (inferred automatically) + * @param list + * the list to modify; if all items from startIx to the end are + * either null or equal to objSeenPreviously, then we truncate + * the list just before startIx. + * @param startIx + * the index to examine; we only move items within the range of + * [startIx, list.size()-1]. + * @param objSeenPreviously + * the object with which to compare list[startIx]; may be null. */ - public static void smartRemoveDuplicatesAndNullsHelper( - final List list, final int startIx, final T objSeenPreviously) - { + public static void smartRemoveDuplicatesAndNullsHelper(final List list, final int startIx, + final T objSeenPreviously) { while (startIx < list.size() - && (list.get(startIx) == null - || list.get(startIx) == objSeenPreviously - || list.get(startIx).equals(objSeenPreviously))) - { + && (list.get(startIx) == null || list.get(startIx) == objSeenPreviously || list.get(startIx).equals( + objSeenPreviously))) { final int lastItemIx = list.size() - 1; // Overwrite the item at laterIx with the one at the end, diff --git a/src/main/java/net/slightlymagic/braids/util/generator/FindNonDirectoriesSkipDotDirectoriesGenerator.java b/src/main/java/net/slightlymagic/braids/util/generator/FindNonDirectoriesSkipDotDirectoriesGenerator.java index 4b228891708..d32672eb3bf 100644 --- a/src/main/java/net/slightlymagic/braids/util/generator/FindNonDirectoriesSkipDotDirectoriesGenerator.java +++ b/src/main/java/net/slightlymagic/braids/util/generator/FindNonDirectoriesSkipDotDirectoriesGenerator.java @@ -1,61 +1,69 @@ /** Licensed under both the GPL and the Apache 2.0 License. */ package net.slightlymagic.braids.util.generator; +import java.io.File; + import com.google.code.jyield.Generator; import com.google.code.jyield.Yieldable; -import java.io.File; - /** * This is a generator over all of the non-directories residing in a given - * starting directory and all subdirectories of it that do NOT start with a - * dot; this prevents the code from descending into .svn directories. + * starting directory and all subdirectories of it that do NOT start with a dot; + * this prevents the code from descending into .svn directories. * * For documentation on Java-Yield and its generators, see * {@link com.google.code.jyield.Generator} */ public class FindNonDirectoriesSkipDotDirectoriesGenerator implements Generator { - private File startDir; + private File startDir; - /** - * Create a generator at a given starting directory. - * - * One can invoke this generator more than once by calling its generate - * method. - * - * @param startDir the directory to start in; we ignore this directory's - * name, so if it starts with a dot, we treat it as if it didn't. - */ - public FindNonDirectoriesSkipDotDirectoriesGenerator(File startDir) { - this.startDir = startDir; - } + /** + * Create a generator at a given starting directory. + * + * One can invoke this generator more than once by calling its generate + * method. + * + * @param startDir + * the directory to start in; we ignore this directory's name, so + * if it starts with a dot, we treat it as if it didn't. + */ + public FindNonDirectoriesSkipDotDirectoriesGenerator(final File startDir) { + this.startDir = startDir; + } - /** - * Standard generate method. - * - *

Yields results to the given Yieldable. Convert Generator instances to - * Iterables with YieldUtils.toIterable.

- * - * See {@link com.google.code.jyield.YieldUtils#toIterable(com.google.code.jyield.Generator)} - */ - public void generate(Yieldable yy) { - String[] list = startDir.list(); - - for (String filename : list) { - File entry = new File(startDir, filename); - - if (entry.isDirectory()) { - if (!filename.startsWith(".")) { - FindNonDirectoriesSkipDotDirectoriesGenerator child = new FindNonDirectoriesSkipDotDirectoriesGenerator(entry); - child.generate(yy); - child = null; - } - // else do nothing, because it's a dot directory - } - else { - // Use this instead of a return statement. - yy.yield(entry); - } - } - } + /** + * Standard generate method. + * + *

+ * Yields results to the given Yieldable. Convert Generator instances to + * Iterables with YieldUtils.toIterable. + *

+ * + * See + * {@link com.google.code.jyield.YieldUtils#toIterable(com.google.code.jyield.Generator)} + * + * @param yy + * the yy + */ + public final void generate(final Yieldable yy) { + String[] list = startDir.list(); + + for (String filename : list) { + File entry = new File(startDir, filename); + + if (entry.isDirectory()) { + if (!filename.startsWith(".")) { + FindNonDirectoriesSkipDotDirectoriesGenerator child = + new FindNonDirectoriesSkipDotDirectoriesGenerator( + entry); + child.generate(yy); + child = null; + } + // else do nothing, because it's a dot directory + } else { + // Use this instead of a return statement. + yy.yield(entry); + } + } + } } diff --git a/src/main/java/net/slightlymagic/braids/util/generator/GeneratorFromArray.java b/src/main/java/net/slightlymagic/braids/util/generator/GeneratorFromArray.java index 6b082f56429..72ed7a72f1c 100644 --- a/src/main/java/net/slightlymagic/braids/util/generator/GeneratorFromArray.java +++ b/src/main/java/net/slightlymagic/braids/util/generator/GeneratorFromArray.java @@ -4,33 +4,43 @@ import com.google.code.jyield.Generator; import com.google.code.jyield.Yieldable; /** - * Creates a Generator from an array; generators are a handy - * substitute for passing around and creating temporary - * lists, collections, and arrays. + * Creates a Generator from an array; generators are a handy substitute for + * passing around and creating temporary lists, collections, and arrays. * - * {@link com.google.code.jyield.Generator} + * @param + * the generic type {@link com.google.code.jyield.Generator} */ public class GeneratorFromArray implements Generator { - private T[] array; + private T[] array; - /** - * Create a Generator from an array - * - * @param array from which to generate items - */ - public GeneratorFromArray(T[] array) { - this.array = array; - } + /** + * Create a Generator from an array. + * + * @param array + * from which to generate items + */ + public GeneratorFromArray(final T[] array) { + this.array = array; + } - @Override - /** - * Submits all of the array's elements to the yieldable. - * - * @param yy the yieldable which receives the elements - */ - public void generate(Yieldable yy) { - for (T item : array) { - yy.yield(item); - } - } + /* + * (non-Javadoc) + * + * @see + * com.google.code.jyield.Generator#generate(com.google.code.jyield.Yieldable + * ) + */ + + /** + * Submits all of the array's elements to the yieldable. + * + * @param yy + * the yieldable which receives the elements + */ + @Override + public final void generate(final Yieldable yy) { + for (T item : array) { + yy.yield(item); + } + } } diff --git a/src/main/java/net/slightlymagic/braids/util/generator/GeneratorFunctions.java b/src/main/java/net/slightlymagic/braids/util/generator/GeneratorFunctions.java index 6d0a47e8ed7..fca78c5c37c 100644 --- a/src/main/java/net/slightlymagic/braids/util/generator/GeneratorFunctions.java +++ b/src/main/java/net/slightlymagic/braids/util/generator/GeneratorFunctions.java @@ -1,204 +1,215 @@ /** Licensed under both the GPL and the Apache 2.0 License. */ package net.slightlymagic.braids.util.generator; -import com.google.code.jyield.Generator; -import com.google.code.jyield.YieldUtils; -import com.google.code.jyield.Yieldable; -import net.slightlymagic.braids.util.lambda.Lambda1; - import java.util.ArrayList; import java.util.NoSuchElementException; +import net.slightlymagic.braids.util.lambda.Lambda1; + +import com.google.code.jyield.Generator; +import com.google.code.jyield.YieldUtils; +import com.google.code.jyield.Yieldable; + /** - * For documentation on Java-Yield and its generators, see + * For documentation on Java-Yield and its generators, see. + * * {@link com.google.code.jyield.Generator}. */ public final class GeneratorFunctions { - /** - * Do not instantiate. - */ - private GeneratorFunctions() { - ; - } + /** + * Do not instantiate. + */ + private GeneratorFunctions() { + } - /** - * Estimate the number of items in this generator by traversing all of its - * elements. - * - * Note this only works on a generator that can be reinstantiated once it - * has been traversed. This is only an estimate, because a generator's size - * may vary been traversals. This is especially true if the generator - * relies on external resources, such as a file system. - * - * If you call this on an infinite generator, this method will never - * return. - * - * @return the estimated number of items provided by this generator - */ - public static long estimateSize(Generator gen) { - long result = 0; - for (@SuppressWarnings("unused") T ignored : YieldUtils.toIterable(gen)) - { - result++; - } - - return result; - } + /** + * Estimate the number of items in this generator by traversing all of its + * elements. + * + * Note this only works on a generator that can be reinstantiated once it + * has been traversed. This is only an estimate, because a generator's size + * may vary been traversals. This is especially true if the generator relies + * on external resources, such as a file system. + * + * If you call this on an infinite generator, this method will never return. + * + * @param + * the generic type + * @param gen + * the gen + * @return the estimated number of items provided by this generator + */ + public static long estimateSize(final Generator gen) { + long result = 0; + for (@SuppressWarnings("unused") + T ignored : YieldUtils.toIterable(gen)) + { + result++; + } - /** - * Highly efficient means of filtering a long or infinite sequence. - * - * @param any type - * - * @param predicate a Lambda (function) whose apply method takes an object - * of type and returns a Boolean. If it returns false or null, the - * item from the inputGenerator is not yielded by this Generator; - * if predicate.apply returns true, then this Generator does - * yield the value. - * - * @param inputGenerator the sequence upon which we operate - * - * @return a generator which produces a subset <= the inputGenerator - */ - public static Generator filterGenerator( - final Lambda1 predicate, final Generator inputGenerator) - { - Generator result = new Generator() { + return result; + } - @Override - public void generate(final Yieldable outputYield) { + /** + * Highly efficient means of filtering a long or infinite sequence. + * + * @param + * any type + * + * @param predicate + * a Lambda (function) whose apply method takes an object of type + * and returns a Boolean. If it returns false or null, the + * item from the inputGenerator is not yielded by this Generator; + * if predicate.apply returns true, then this Generator + * does yield the value. + * + * @param inputGenerator + * the sequence upon which we operate + * + * @return a generator which produces a subset <= the inputGenerator + */ + public static Generator filterGenerator(final Lambda1 predicate, + final Generator inputGenerator) + { + Generator result = new Generator() { - Yieldable inputYield = new Yieldable() { - Boolean pResult; - - @Override - public void yield(T input) { - pResult = predicate.apply(input); - if (pResult != null && pResult) { - outputYield.yield(input); - } - } - }; - - inputGenerator.generate(inputYield); - } - - }; - - return result; - } + @Override + public void generate(final Yieldable outputYield) { - /** - * Highly efficient means of applying a transform to a long or infinite - * sequence. - * - * @param any type - * - * @param transform a Lambda (function) whose apply method takes an object - * of type and returns an object of the same type. This transforms - * the values from the inputGenerator into this Generator. - * - * @param inputGenerator the sequence upon which we operate - * - * @return a generator that yields transform.apply's return value for - * each item in the inputGenerator - */ - public static Generator transformGenerator( - final Lambda1 transform, final Generator inputGenerator) - { - Generator result = new Generator() { + Yieldable inputYield = new Yieldable() { + Boolean pResult; - @Override - public void generate(final Yieldable outputYield) { + @Override + public void yield(final T input) { + pResult = predicate.apply(input); + if (pResult != null && pResult) { + outputYield.yield(input); + } + } + }; - Yieldable inputYield = new Yieldable() { - @Override - public void yield(T input) { - outputYield.yield(transform.apply(input)); - } - }; - - inputGenerator.generate(inputYield); - } - - }; - - return result; - } + inputGenerator.generate(inputYield); + } - /** - * Forces a generator to be completely evaluated into a temporary data - * structure, then returns the generator over that same structure. - * - * This effectively returns the same Generator, but it is a faster one. - * This trades away heap space for reduced CPU intensity. This is - * particuarly helpful if you know that a Generator is going to be - * totally evaluated more than once in the near future. - * - * @param inferred automatically - * - * @param unevaluated a Generator of T instances - * - * @return the equivalent Generator, except that the result's generate - * method can be invoked multiple times for fast results. - */ - public static Generator solidify(Generator unevaluated) { + }; + + return result; + } + + /** + * Highly efficient means of applying a transform to a long or infinite + * sequence. + * + * @param + * any type + * + * @param transform + * a Lambda (function) whose apply method takes an object of type + * and returns an object of the same type. This transforms + * the values from the inputGenerator into this Generator. + * + * @param inputGenerator + * the sequence upon which we operate + * + * @return a generator that yields transform.apply's return value for each + * item in the inputGenerator + */ + public static Generator transformGenerator(final Lambda1 transform, final Generator inputGenerator) + { + Generator result = new Generator() { + + @Override + public void generate(final Yieldable outputYield) { + + Yieldable inputYield = new Yieldable() { + @Override + public void yield(final T input) { + outputYield.yield(transform.apply(input)); + } + }; + + inputGenerator.generate(inputYield); + } + + }; + + return result; + } + + /** + * Forces a generator to be completely evaluated into a temporary data + * structure, then returns the generator over that same structure. + * + * This effectively returns the same Generator, but it is a faster one. This + * trades away heap space for reduced CPU intensity. This is particuarly + * helpful if you know that a Generator is going to be totally evaluated + * more than once in the near future. + * + * @param + * inferred automatically + * + * @param unevaluated + * a Generator of T instances + * + * @return the equivalent Generator, except that the result's generate + * method can be invoked multiple times for fast results. + */ + public static Generator solidify(final Generator unevaluated) { ArrayList solidTmp = YieldUtils.toArrayList(unevaluated); solidTmp.trimToSize(); return YieldUtils.toGenerator(solidTmp); - } + } - /** - * Select an item at random from a Generator; this causes the entire - * Generator to be evaluated once, but only once. - * - * @param generator - * the generator from which to select a random item - * - * @return an item chosen at random from the generator; this may be null, if - * the generator contains null items. - * - * @throws NoSuchElementException - * if the generator has no contents - */ - public static T selectRandom(Generator generator) - throws NoSuchElementException - { - /* - * This algorithm requires some explanation. Each time we encounter a - * new item from the generator, we determine via random chance if the - * item is the one we select. At the end of each iteration, we have a - * candidate, and we have a count of the number of items encountered so - * far. Each iteration has a 1/n chance of replacing the candidate with - * the current item, where n is the number of items encountered so far. - * This allows us to randomly select an item from the generated contents - * with an equal distribution; and we don't have to count the number of - * items first! - */ + /** + * Select an item at random from a Generator; this causes the entire + * Generator to be evaluated once, but only once. + * + * @param + * the generic type + * @param generator + * the generator from which to select a random item + * @return an item chosen at random from the generator; this may be null, if + * the generator contains null items. + * @throws NoSuchElementException + * if the generator has no contents + */ + public static T selectRandom(final Generator generator) throws NoSuchElementException + { + /* + * This algorithm requires some explanation. Each time we encounter a + * new item from the generator, we determine via random chance if the + * item is the one we select. At the end of each iteration, we have a + * candidate, and we have a count of the number of items encountered so + * far. Each iteration has a 1/n chance of replacing the candidate with + * the current item, where n is the number of items encountered so far. + * This allows us to randomly select an item from the generated contents + * with an equal distribution; and we don't have to count the number of + * items first! + */ - int n = 0; - T candidate = null; - - for (T item : YieldUtils.toIterable(generator)) { - n++; - int rand = (int) (Math.random() * n); - // At this point, 0 <= rand < n. - rand++; // Now, 1 <= rand <= n. - - if (rand == 1) { - // We rolled a 1 on an n-sided die. We have a new candidate! - // Note that on the first iteration, this always happens, - // because n = 1. - candidate = item; - } - } + int n = 0; + T candidate = null; - if (n == 0) { - // There were no items in the generator! - throw new NoSuchElementException("generator is empty"); - } + for (T item : YieldUtils.toIterable(generator)) { + n++; + int rand = (int) (Math.random() * n); + // At this point, 0 <= rand < n. + rand++; // Now, 1 <= rand <= n. - return candidate; - } + if (rand == 1) { + // We rolled a 1 on an n-sided die. We have a new candidate! + // Note that on the first iteration, this always happens, + // because n = 1. + candidate = item; + } + } + + if (n == 0) { + // There were no items in the generator! + throw new NoSuchElementException("generator is empty"); + } + + return candidate; + } }