You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mb...@apache.org on 2008/06/09 19:17:43 UTC

svn commit: r665786 [3/6] - in /commons/sandbox/functor/trunk/src: main/java/org/apache/commons/functor/adapter/ main/java/org/apache/commons/functor/core/ main/java/org/apache/commons/functor/core/algorithm/ main/java/org/apache/commons/functor/core/c...

Modified: commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/ComparatorFunction.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/ComparatorFunction.java?rev=665786&r1=665785&r2=665786&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/ComparatorFunction.java (original)
+++ commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/ComparatorFunction.java Mon Jun  9 10:17:39 2008
@@ -28,28 +28,27 @@
  * @version $Revision$ $Date$
  * @author Rodney Waldhoff
  */
-public final class ComparatorFunction implements BinaryFunction, Serializable {
-    private Comparator comparator = null;
+public final class ComparatorFunction<T> implements BinaryFunction<T, T, Integer>, Serializable {
+    private static final ComparatorFunction<Comparable<?>> INSTANCE = new ComparatorFunction<Comparable<?>>(
+            ComparableComparator.instance());
 
-    /**
-     * Create a new ComparatorFunction.
-     */
-    public ComparatorFunction() {
-        this(null);
-    }
+    private Comparator<? super T> comparator = null;
 
     /**
      * Create a new ComparatorFunction.
      * @param comparator to wrap
      */
-    public ComparatorFunction(Comparator comparator) {
-        this.comparator = null == comparator ? ComparableComparator.instance() : comparator;
+    public ComparatorFunction(Comparator<? super T> comparator) {
+        if (comparator == null) {
+            throw new IllegalArgumentException("Comparator must not be null");
+        }
+        this.comparator = comparator;
     }
 
     /**
      * {@inheritDoc}
      */
-    public Object evaluate(Object left, Object right) {
+    public Integer evaluate(T left, T right) {
         return new Integer(comparator.compare(left, right));
     }
 
@@ -57,7 +56,7 @@
      * {@inheritDoc}
      */
     public boolean equals(Object that) {
-        return that == this || (that instanceof ComparatorFunction && equals((ComparatorFunction) that));
+        return that == this || (that instanceof ComparatorFunction && equals((ComparatorFunction<?>) that));
     }
 
     /**
@@ -65,7 +64,7 @@
      * @param that the ComparatorFunction to test
      * @return boolean
      */
-    public boolean equals(ComparatorFunction that) {
+    public boolean equals(ComparatorFunction<?> that) {
         return null != that && comparator.equals(that.comparator);
     }
 
@@ -83,4 +82,11 @@
         return "ComparatorFunction<" + comparator + ">";
     }
 
+    /**
+     * Get a basic ComparatorFunction instance.
+     * @return ComparatorFunction
+     */
+    public static ComparatorFunction<Comparable<?>> instance() {
+        return INSTANCE;
+    }
 }

Modified: commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/IsEquivalent.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/IsEquivalent.java?rev=665786&r1=665785&r2=665786&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/IsEquivalent.java (original)
+++ commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/IsEquivalent.java Mon Jun  9 10:17:39 2008
@@ -36,18 +36,11 @@
  * @author Rodney Waldhoff
  *
  */
-public final class IsEquivalent implements BinaryPredicate, Serializable {
-    private static final IsEquivalent COMPARABLE_INSTANCE = new IsEquivalent();
+public final class IsEquivalent<T> implements BinaryPredicate<T, T>, Serializable {
+    private static final IsEquivalent<Comparable<?>> COMPARABLE_INSTANCE = new IsEquivalent<Comparable<?>>(
+            ComparableComparator.instance());
 
-    private Comparator comparator = null;
-
-    /**
-     * Construct an <code>IsEquivalent</code> {@link BinaryPredicate predicate}
-     * for {@link Comparable Comparable}s.
-     */
-    public IsEquivalent() {
-        this(null);
-    }
+    private Comparator<? super T> comparator;
 
     /**
      * Construct an <code>IsEquivalent</code> {@link BinaryPredicate predicate}
@@ -57,8 +50,11 @@
      *        a <code>Comparator</code> for {@link Comparable Comparable}s will
      *        be used.
      */
-    public IsEquivalent(Comparator comparator) {
-        this.comparator = null == comparator ? ComparableComparator.instance() : comparator;
+    public IsEquivalent(Comparator<? super T> comparator) {
+        if (comparator == null) {
+            throw new IllegalArgumentException("Comparator must not be null");
+        }
+        this.comparator = comparator;
     }
 
     /**
@@ -67,7 +63,7 @@
      * {@link Comparator Comparator}.
      * {@inheritDoc}
      */
-    public boolean test(Object left, Object right) {
+    public boolean test(T left, T right) {
         return comparator.compare(left, right) == 0;
     }
 
@@ -75,7 +71,7 @@
      * {@inheritDoc}
      */
     public boolean equals(Object that) {
-        return that == this || (that instanceof IsEquivalent && equals((IsEquivalent) that));
+        return that == this || (that instanceof IsEquivalent && equals((IsEquivalent<?>) that));
     }
 
     /**
@@ -83,7 +79,7 @@
      * @param that IsEquivalent to test
      * @return boolean
      */
-    public boolean equals(IsEquivalent that) {
+    public boolean equals(IsEquivalent<?> that) {
         return null != that && null == comparator ? null == that.comparator : comparator.equals(that.comparator);
     }
 
@@ -108,7 +104,7 @@
      * Get a basic IsEquivalent instance.
      * @return IsEquivalent
      */
-    public static final IsEquivalent instance() {
+    public static final IsEquivalent<Comparable<?>> instance() {
         return COMPARABLE_INSTANCE;
     }
 
@@ -117,7 +113,7 @@
      * @param right argument
      * @return UnaryPredicate
      */
-    public static final UnaryPredicate instance(Comparable right) {
+    public static final UnaryPredicate<Comparable<?>> instance(Comparable<?> right) {
         return RightBoundPredicate.bind(instance(), right);
     }
 

Modified: commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/IsGreaterThan.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/IsGreaterThan.java?rev=665786&r1=665785&r2=665786&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/IsGreaterThan.java (original)
+++ commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/IsGreaterThan.java Mon Jun  9 10:17:39 2008
@@ -33,17 +33,21 @@
  * @version $Revision$ $Date$
  * @author Rodney Waldhoff
  */
-public final class IsGreaterThan implements BinaryPredicate, Serializable {
-    private static final IsGreaterThan COMPARABLE_INSTANCE = new IsGreaterThan();
+public final class IsGreaterThan<T> implements BinaryPredicate<T, T>, Serializable {
+    /**
+     * Basic IsGreaterThan instance.
+     */
+    public static final IsGreaterThan<Comparable<?>> INSTANCE = IsGreaterThan.<Comparable<?>>instance();
 
-    private Comparator comparator = null;
+    private Comparator<? super T> comparator = null;
 
     /**
      * Construct a <code>IsGreaterThan</code> {@link BinaryPredicate predicate}
      * for {@link Comparable Comparable}s.
      */
+    @SuppressWarnings("unchecked")
     public IsGreaterThan() {
-        this(null);
+        this(ComparableComparator.INSTANCE);
     }
 
     /**
@@ -54,8 +58,11 @@
      *        a <code>Comparator</code> for {@link Comparable Comparable}s will
      *        be used.
      */
-    public IsGreaterThan(Comparator comparator) {
-        this.comparator = null == comparator ? ComparableComparator.instance() : comparator;
+    public IsGreaterThan(Comparator<? super T> comparator) {
+        if (comparator == null) {
+            throw new IllegalArgumentException("Comparator argument must not be null");
+        }
+        this.comparator = comparator;
     }
 
     /**
@@ -64,7 +71,7 @@
      * {@link Comparator Comparator}.
      * {@inheritDoc}
      */
-    public boolean test(Object left, Object right) {
+    public boolean test(T left, T right) {
         return comparator.compare(left, right) > 0;
     }
 
@@ -72,7 +79,7 @@
      * {@inheritDoc}
      */
     public boolean equals(Object that) {
-        return that == this || (that instanceof IsGreaterThan && equals((IsGreaterThan) that));
+        return that == this || (that instanceof IsGreaterThan && equals((IsGreaterThan<?>) that));
     }
 
     /**
@@ -80,7 +87,7 @@
      * @param that the IsGreaterThan to test
      * @return boolean
      */
-    public boolean equals(IsGreaterThan that) {
+    public boolean equals(IsGreaterThan<?> that) {
         return null != that && null == comparator ? null == that.comparator : comparator.equals(that.comparator);
     }
 
@@ -102,20 +109,21 @@
     }
 
     /**
-     * Get a basic IsGreaterThan instance.
-     * @return IsGreaterThan
+     * Get a typed IsGreaterThan instance.
+     * @param <T>
+     * @return IsGreaterThan<T>
      */
-    public static final IsGreaterThan instance() {
-        return COMPARABLE_INSTANCE;
+    public static final <T extends Comparable<?>> IsGreaterThan<T> instance() {
+        return new IsGreaterThan<T>();
     }
 
     /**
      * Get an IsGreaterThan UnaryPredicate.
      * @param right the right side object of the IsGreaterThan comparison
-     * @return UnaryPredicate
+     * @return UnaryPredicate<T>
      */
-    public static final UnaryPredicate instance(Comparable right) {
-        return RightBoundPredicate.bind(instance(), right);
+    public static final <T extends Comparable<?>> UnaryPredicate<T> instance(T right) {
+        return RightBoundPredicate.bind(new IsGreaterThan<T>(), right);
     }
 
 }

Modified: commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/IsGreaterThanOrEqual.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/IsGreaterThanOrEqual.java?rev=665786&r1=665785&r2=665786&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/IsGreaterThanOrEqual.java (original)
+++ commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/IsGreaterThanOrEqual.java Mon Jun  9 10:17:39 2008
@@ -33,17 +33,22 @@
  * @version $Revision$ $Date$
  * @author Rodney Waldhoff
  */
-public final class IsGreaterThanOrEqual implements BinaryPredicate, Serializable {
-    private static final IsGreaterThanOrEqual COMPARABLE_INSTANCE = new IsGreaterThanOrEqual();
+public final class IsGreaterThanOrEqual<T> implements BinaryPredicate<T, T>, Serializable {
+    /**
+     * Basic IsGreaterThanOrEqual instance.
+     */
+    public static final IsGreaterThanOrEqual<Comparable<?>> INSTANCE = IsGreaterThanOrEqual
+            .<Comparable<?>> instance();
 
-    private Comparator comparator = null;
+    private Comparator<? super T> comparator = null;
 
     /**
      * Construct a <code>IsGreaterThanOrEqual</code> {@link BinaryPredicate predicate}
      * for {@link Comparable Comparable}s.
      */
+    @SuppressWarnings("unchecked")
     public IsGreaterThanOrEqual() {
-        this(null);
+        this(ComparableComparator.INSTANCE);
     }
 
     /**
@@ -54,8 +59,11 @@
      *        a <code>Comparator</code> for {@link Comparable Comparable}s will
      *        be used.
      */
-    public IsGreaterThanOrEqual(Comparator comparator) {
-        this.comparator = null == comparator ? ComparableComparator.instance() : comparator;
+    public IsGreaterThanOrEqual(Comparator<? super T> comparator) {
+        if (comparator == null) {
+            throw new IllegalArgumentException("Comparator argument must not be null");
+        }
+        this.comparator = comparator;
     }
 
     /**
@@ -64,7 +72,7 @@
      * {@link Comparator Comparator}.
      * {@inheritDoc}
      */
-    public boolean test(Object left, Object right) {
+    public boolean test(T left, T right) {
         return comparator.compare(left, right) >= 0;
     }
 
@@ -72,7 +80,7 @@
      * {@inheritDoc}
      */
     public boolean equals(Object that) {
-        return that == this || (that instanceof IsGreaterThanOrEqual && equals((IsGreaterThanOrEqual) that));
+        return that == this || (that instanceof IsGreaterThanOrEqual && equals((IsGreaterThanOrEqual<?>) that));
     }
 
     /**
@@ -80,7 +88,7 @@
      * @param that IsGreaterThanOrEqual to test
      * @return boolean
      */
-    public boolean equals(IsGreaterThanOrEqual that) {
+    public boolean equals(IsGreaterThanOrEqual<?> that) {
         return null != that && null == comparator ? null == that.comparator : comparator.equals(that.comparator);
     }
 
@@ -102,11 +110,12 @@
     }
 
     /**
-     * Get a basic IsGreaterThanOrEqual instance.
-     * @return IsGreaterThanOrEqual
+     * Get a typed IsGreaterThanOrEqual instance.
+     * @param <T>
+     * @return IsGreaterThanOrEqual<T>
      */
-    public static final IsGreaterThanOrEqual instance() {
-        return COMPARABLE_INSTANCE;
+    public static final <T extends Comparable<?>> IsGreaterThanOrEqual<T> instance() {
+        return new IsGreaterThanOrEqual<T>();
     }
 
     /**
@@ -114,8 +123,8 @@
      * @param right the right side object of the IsGreaterThanOrEqual comparison
      * @return UnaryPredicate
      */
-    public static final UnaryPredicate instance(Comparable right) {
-        return RightBoundPredicate.bind(instance(), right);
+    public static final <T extends Comparable<?>> UnaryPredicate<T> instance(T right) {
+        return RightBoundPredicate.bind(new IsGreaterThanOrEqual<T>(), right);
     }
 
 }

Modified: commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/IsLessThan.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/IsLessThan.java?rev=665786&r1=665785&r2=665786&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/IsLessThan.java (original)
+++ commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/IsLessThan.java Mon Jun  9 10:17:39 2008
@@ -33,17 +33,21 @@
  * @version $Revision$ $Date$
  * @author Rodney Waldhoff
  */
-public final class IsLessThan implements BinaryPredicate, Serializable {
-    private static final IsLessThan COMPARABLE_INSTANCE = new IsLessThan();
+public final class IsLessThan<T> implements BinaryPredicate<T, T>, Serializable {
+    /**
+     * Basic IsLessThan instance.
+     */
+    public static final IsLessThan<Comparable<?>> INSTANCE = IsLessThan.<Comparable<?>>instance();
 
-    private Comparator comparator = null;
+    private Comparator<? super T> comparator = null;
 
     /**
      * Construct a <code>IsLessThan</code> {@link BinaryPredicate predicate}
      * for {@link Comparable Comparable}s.
      */
+    @SuppressWarnings("unchecked")
     public IsLessThan() {
-        this(null);
+        this(ComparableComparator.INSTANCE);
     }
 
     /**
@@ -54,8 +58,11 @@
      *        a <code>Comparator</code> for {@link Comparable Comparable}s will
      *        be used.
      */
-    public IsLessThan(Comparator comparator) {
-        this.comparator = null == comparator ? ComparableComparator.instance() : comparator;
+    public IsLessThan(Comparator<? super T> comparator) {
+        if (comparator == null) {
+            throw new IllegalArgumentException("Comparator argument must not be null");
+        }
+        this.comparator = comparator;
     }
 
     /**
@@ -64,7 +71,7 @@
      * {@link Comparator Comparator}.
      * {@inheritDoc}
      */
-    public boolean test(Object left, Object right) {
+    public boolean test(T left, T right) {
         return comparator.compare(left, right) < 0;
     }
 
@@ -72,7 +79,7 @@
      * {@inheritDoc}
      */
     public boolean equals(Object that) {
-        return that == this || (that instanceof IsLessThan && equals((IsLessThan) that));
+        return that == this || (that instanceof IsLessThan && equals((IsLessThan<?>) that));
     }
 
     /**
@@ -80,7 +87,7 @@
      * @param that IsLessThan to test
      * @return boolean
      */
-    public boolean equals(IsLessThan that) {
+    public boolean equals(IsLessThan<?> that) {
         return null != that && null == comparator ? null == that.comparator : comparator.equals(that.comparator);
     }
 
@@ -102,11 +109,12 @@
     }
 
     /**
-     * Get a basic IsLessThan instance.
-     * @return IsLessThan
+     * Get a typed IsLessThan instance.
+     * @param <T>
+     * @return IsLessThan<T>
      */
-    public static final IsLessThan instance() {
-        return COMPARABLE_INSTANCE;
+    public static final <T extends Comparable<?>> IsLessThan<T> instance() {
+        return new IsLessThan<T>();
     }
 
     /**
@@ -114,8 +122,8 @@
      * @param right the right side object of the comparison.
      * @return UnaryPredicate
      */
-    public static final UnaryPredicate instance(Comparable right) {
-        return RightBoundPredicate.bind(instance(), right);
+    public static final <T extends Comparable<?>> UnaryPredicate<T> instance(T right) {
+        return RightBoundPredicate.bind(new IsLessThan<T>(), right);
     }
 
 }

Modified: commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/IsLessThanOrEqual.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/IsLessThanOrEqual.java?rev=665786&r1=665785&r2=665786&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/IsLessThanOrEqual.java (original)
+++ commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/IsLessThanOrEqual.java Mon Jun  9 10:17:39 2008
@@ -33,17 +33,21 @@
  * @version $Revision$ $Date$
  * @author Rodney Waldhoff
  */
-public final class IsLessThanOrEqual implements BinaryPredicate, Serializable {
-    private static final IsLessThanOrEqual COMPARABLE_INSTANCE = new IsLessThanOrEqual();
+public final class IsLessThanOrEqual<T> implements BinaryPredicate<T, T>, Serializable {
+    /**
+     * Basic IsLessThanOrEqual instance.
+     */
+    public static final IsLessThanOrEqual<Comparable<?>> INSTANCE = IsLessThanOrEqual.<Comparable<?>>instance();
 
-    private Comparator comparator = null;
+    private Comparator<? super T> comparator = null;
 
     /**
      * Construct a <code>IsLessThanOrEqual</code> {@link BinaryPredicate predicate}
      * for {@link Comparable Comparable}s.
      */
+    @SuppressWarnings("unchecked")
     public IsLessThanOrEqual() {
-        this(null);
+        this(ComparableComparator.INSTANCE);
     }
 
     /**
@@ -54,8 +58,11 @@
      *        a <code>Comparator</code> for {@link Comparable Comparable}s will
      *        be used.
      */
-    public IsLessThanOrEqual(Comparator comparator) {
-        this.comparator = null == comparator ? ComparableComparator.instance() : comparator;
+    public IsLessThanOrEqual(Comparator<? super T> comparator) {
+        if (comparator == null) {
+            throw new IllegalArgumentException("Comparator argument must not be null");
+        }
+        this.comparator = comparator;
     }
 
     /**
@@ -64,7 +71,7 @@
      * less than or equal to the <i>right</i> parameter under my current
      * {@link Comparator Comparator}.
      */
-    public boolean test(Object left, Object right) {
+    public boolean test(T left, T right) {
         return comparator.compare(left, right) <= 0;
     }
 
@@ -72,7 +79,7 @@
      * {@inheritDoc}
      */
     public boolean equals(Object that) {
-        return that == this || (that instanceof IsLessThanOrEqual && equals((IsLessThanOrEqual) that));
+        return that == this || (that instanceof IsLessThanOrEqual && equals((IsLessThanOrEqual<?>) that));
     }
 
     /**
@@ -80,7 +87,7 @@
      * @param that the IsLessThanOrEqual to test.
      * @return boolean
      */
-    public boolean equals(IsLessThanOrEqual that) {
+    public boolean equals(IsLessThanOrEqual<?> that) {
         return null != that && null == comparator ? null == that.comparator : comparator.equals(that.comparator);
     }
 
@@ -102,11 +109,12 @@
     }
 
     /**
-     * Get a basic IsLessThanOrEqual instance.
-     * @return IsLessThanOrEqual
+     * Get a typed IsLessThanOrEqual instance.
+     * @param <T>
+     * @return IsLessThanOrEqual<T>
      */
-    public static final IsLessThanOrEqual instance() {
-        return COMPARABLE_INSTANCE;
+    public static final <T extends Comparable<?>> IsLessThanOrEqual<T> instance() {
+        return new IsLessThanOrEqual<T>();
     }
 
     /**
@@ -114,8 +122,8 @@
      * @param right the right side object of the comparison.
      * @return UnaryPredicate
      */
-    public static final UnaryPredicate instance(Comparable right) {
-        return RightBoundPredicate.bind(instance(), right);
+    public static final <T extends Comparable<?>> UnaryPredicate<T> instance(T right) {
+        return RightBoundPredicate.bind(new IsLessThanOrEqual<T>(), right);
     }
 
 }

Modified: commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/IsNotEquivalent.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/IsNotEquivalent.java?rev=665786&r1=665785&r2=665786&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/IsNotEquivalent.java (original)
+++ commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/IsNotEquivalent.java Mon Jun  9 10:17:39 2008
@@ -36,17 +36,10 @@
  * @author Rodney Waldhoff
  *
  */
-public final class IsNotEquivalent implements BinaryPredicate, Serializable {
-    private static final IsNotEquivalent COMPARABLE_INSTANCE = new IsNotEquivalent();
+public final class IsNotEquivalent<T> implements BinaryPredicate<T, T>, Serializable {
+    private static final IsNotEquivalent<Comparable<?>> COMPARABLE_INSTANCE = new IsNotEquivalent<Comparable<?>>(ComparableComparator.instance());
 
-    private Comparator comparator = null;
-    /**
-     * Construct a <code>IsNotEquivalent</code> {@link BinaryPredicate predicate}
-     * for {@link Comparable Comparable}s.
-     */
-    public IsNotEquivalent() {
-        this(null);
-    }
+    private Comparator<? super T> comparator = null;
 
     /**
      * Construct a <code>IsNotEquivalent</code> {@link BinaryPredicate predicate}
@@ -56,8 +49,11 @@
      *        a <code>Comparator</code> for {@link Comparable Comparable}s will
      *        be used.
      */
-    public IsNotEquivalent(Comparator comparator) {
-        this.comparator = null == comparator ? ComparableComparator.instance() : comparator;
+    public IsNotEquivalent(Comparator<? super T> comparator) {
+        if (comparator == null) {
+            throw new IllegalArgumentException("Comparator must not be null");
+        }
+        this.comparator = comparator;
     }
 
     /**
@@ -66,7 +62,7 @@
      * not equal to the <i>right</i> parameter under my current
      * {@link Comparator Comparator}.
      */
-    public boolean test(Object left, Object right) {
+    public boolean test(T left, T right) {
         return comparator.compare(left, right) != 0;
     }
 
@@ -74,7 +70,7 @@
      * {@inheritDoc}
      */
     public boolean equals(Object that) {
-        return that == this || (that instanceof IsNotEquivalent && equals((IsNotEquivalent) that));
+        return that == this || (that instanceof IsNotEquivalent && equals((IsNotEquivalent<?>) that));
     }
 
     /**
@@ -82,7 +78,7 @@
      * @param that IsNotEquivalent to test
      * @return boolean
      */
-    public boolean equals(IsNotEquivalent that) {
+    public boolean equals(IsNotEquivalent<?> that) {
         return null != that && null == comparator ? null == that.comparator : comparator.equals(that.comparator);
     }
 
@@ -107,7 +103,7 @@
      * Get an IsNotEquivalent instance.
      * @return IsNotEquivalent
      */
-    public static final IsNotEquivalent instance() {
+    public static final IsNotEquivalent<Comparable<?>> instance() {
         return COMPARABLE_INSTANCE;
     }
 
@@ -116,7 +112,7 @@
      * @param right Comparable against which UnaryPredicate arguments will be compared.
      * @return UnaryPredicate
      */
-    public static final UnaryPredicate instance(Comparable right) {
+    public static final UnaryPredicate<Comparable<?>> instance(Comparable<?> right) {
         return RightBoundPredicate.bind(instance(), right);
     }
 

Modified: commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/IsWithinRange.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/IsWithinRange.java?rev=665786&r1=665785&r2=665786&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/IsWithinRange.java (original)
+++ commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/IsWithinRange.java Mon Jun  9 10:17:39 2008
@@ -28,7 +28,7 @@
  * @author  Jason Horman (jason@jhorman.org)
  */
 
-public class IsWithinRange implements UnaryPredicate, Serializable {
+public class IsWithinRange<A extends Comparable<A>> implements UnaryPredicate<A>, Serializable {
     /** Hashcode of the name of this Predicate. */
     private static final int nameHashCode = "IsWithinRange".hashCode();
 
@@ -37,9 +37,9 @@
      ***************************************************/
 
     /** The minimum value of the range. */
-    private Comparable min = null;
+    private A min = null;
     /** The maximum value of the range. */
-    private Comparable max = null;
+    private A max = null;
 
     /***************************************************
      *  Constructors
@@ -51,15 +51,13 @@
      * @param min Comparable
      * @param max Comparable
      */
-    public IsWithinRange(Comparable min, Comparable max) {
+    public IsWithinRange(A min, A max) {
         if (min == null || max == null) {
             throw new IllegalArgumentException("min and max must not be null");
         }
-
         if (min.compareTo(max) > 0) {
             throw new IllegalArgumentException("min must be <= max");
         }
-
         this.min = min;
         this.max = max;
     }
@@ -72,9 +70,8 @@
      * {@inheritDoc}
      * Test if the passed in object is within the specified range.
      */
-    public boolean test(Object o) {
-        Comparable c = (Comparable) o;
-        return c.compareTo(min) >= 0 && c.compareTo(max) <= 0;
+    public boolean test(A o) {
+        return o.compareTo(min) >= 0 && o.compareTo(max) <= 0;
     }
 
     /**
@@ -87,7 +84,7 @@
         if (!(o instanceof IsWithinRange)) {
             return false;
         }
-        final IsWithinRange isWithinRange = (IsWithinRange) o;
+        final IsWithinRange<?> isWithinRange = (IsWithinRange<?>) o;
         return max.equals(isWithinRange.max) && min.equals(isWithinRange.min);
     }
 

Modified: commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/Max.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/Max.java?rev=665786&r1=665785&r2=665786&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/Max.java (original)
+++ commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/Max.java Mon Jun  9 10:17:39 2008
@@ -20,6 +20,8 @@
 import java.util.Comparator;
 
 import org.apache.commons.functor.BinaryFunction;
+import org.apache.commons.functor.UnaryFunction;
+import org.apache.commons.functor.adapter.RightBoundFunction;
 
 /**
  * Adapts a {@link Comparator Comparator} to the
@@ -28,30 +30,37 @@
  * @version $Revision$ $Date$
  * @author Rodney Waldhoff
  */
-public final class Max implements BinaryFunction, Serializable {
-    private static final Max INSTANCE = new Max();
+public final class Max<T> implements BinaryFunction<T, T, T>, Serializable {
+    /**
+     * Basic Max instance.
+     */
+    public static final Max<Comparable<?>> INSTANCE = Max.<Comparable<?>>instance();
 
-    private Comparator comparator = null;
+    private Comparator<T> comparator = null;
 
     /**
      * Create a new Max.
      */
-    public Max() {
-        this(null);
+    @SuppressWarnings("unchecked")
+    public Max() { 
+        this(ComparableComparator.instance());
     }
 
     /**
      * Create a new Max.
      * @param comparator Comparator to use
      */
-    public Max(Comparator comparator) {
-        this.comparator = null == comparator ? ComparableComparator.instance() : comparator;
+    public Max(Comparator<T> comparator) {
+        if (comparator == null) {
+            throw new IllegalArgumentException("Comparator argument must not be null");
+        }
+        this.comparator = comparator;
     }
 
     /**
      * {@inheritDoc}
      */
-    public Object evaluate(Object left, Object right) {
+    public T evaluate(T left, T right) {
         return (comparator.compare(left, right) >= 0) ? left : right;
     }
 
@@ -59,7 +68,7 @@
      * {@inheritDoc}
      */
     public boolean equals(Object that) {
-        return that == this || (that instanceof Max && equals((Max) that));
+        return that == this || (that instanceof Max && equals((Max<?>) that));
     }
 
     /**
@@ -67,7 +76,7 @@
      * @param that Max to test
      * @return boolean
      */
-    public boolean equals(Max that) {
+    public boolean equals(Max<?> that) {
         return null != that && comparator.equals(that.comparator);
     }
 
@@ -89,8 +98,17 @@
      * Get a Max instance.
      * @return Max
      */
-    public static Max instance() {
-        return INSTANCE;
+    public static <T extends Comparable<?>> Max<T> instance() {
+        return new Max<T>();
+    }
+
+    /**
+     * Get a Max UnaryFunction.
+     * @param right the right side argument of the Max function
+     * @return UnaryFunction<T, T>
+     */
+    public static final <T extends Comparable<?>> UnaryFunction<T, T> instance(T right) {
+        return RightBoundFunction.bind(new Max<T>(), right);
     }
 
 }

Modified: commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/Min.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/Min.java?rev=665786&r1=665785&r2=665786&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/Min.java (original)
+++ commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/comparator/Min.java Mon Jun  9 10:17:39 2008
@@ -20,6 +20,8 @@
 import java.util.Comparator;
 
 import org.apache.commons.functor.BinaryFunction;
+import org.apache.commons.functor.UnaryFunction;
+import org.apache.commons.functor.adapter.RightBoundFunction;
 
 /**
  * Adapts a {@link Comparator Comparator} to the
@@ -28,30 +30,37 @@
  * @version $Revision$ $Date$
  * @author Rodney Waldhoff
  */
-public final class Min implements BinaryFunction, Serializable {
-    private static final Min INSTANCE = new Min();
+public final class Min<T> implements BinaryFunction<T, T, T>, Serializable {
+    /**
+     * Basic Min instance.
+     */
+    public static final Min<Comparable<?>> INSTANCE = Min.<Comparable<?>>instance();
 
-    private Comparator comparator = null;
+    private Comparator<T> comparator = null;
 
     /**
      * Create a new Min.
      */
+    @SuppressWarnings("unchecked")
     public Min() {
-        this(null);
+        this(ComparableComparator.instance());
     }
 
     /**
      * Create a new Min.
      * @param comparator to use
      */
-    public Min(Comparator comparator) {
-        this.comparator = null == comparator ? ComparableComparator.instance() : comparator;
+    public Min(Comparator<T> comparator) {
+        if (comparator == null) {
+            throw new IllegalArgumentException("Comparator argument must not be null");
+        }
+        this.comparator = comparator;
     }
 
     /**
      * {@inheritDoc}
      */
-    public Object evaluate(Object left, Object right) {
+    public T evaluate(T left, T right) {
         return (comparator.compare(left, right) <= 0) ? left : right;
     }
 
@@ -59,7 +68,7 @@
      * {@inheritDoc}
      */
     public boolean equals(Object that) {
-        return that == this || (that instanceof Min && equals((Min) that));
+        return that == this || (that instanceof Min && equals((Min<?>) that));
     }
 
     /**
@@ -67,7 +76,7 @@
      * @param that Min to test
      * @return boolean
      */
-    public boolean equals(Min that) {
+    public boolean equals(Min<?> that) {
         return null != that && comparator.equals(that.comparator);
     }
 
@@ -89,8 +98,17 @@
      * Get a basic Min instance.
      * @return Min
      */
-    public static Min instance() {
-        return INSTANCE;
+    public static <T extends Comparable<?>> Min<T> instance() {
+        return new Min<T>();
+    }
+
+    /**
+     * Get a Min UnaryFunction.
+     * @param right the right side argument of the Min function
+     * @return UnaryFunction<T, T>
+     */
+    public static final <T extends Comparable<?>> UnaryFunction<T, T> instance(T right) {
+        return RightBoundFunction.bind(new Min<T>(), right);
     }
 
 }

Modified: commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BaseBinaryPredicateList.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BaseBinaryPredicateList.java?rev=665786&r1=665785&r2=665786&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BaseBinaryPredicateList.java (original)
+++ commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BaseBinaryPredicateList.java Mon Jun  9 10:17:39 2008
@@ -37,11 +37,11 @@
  * @version $Revision$ $Date$
  * @author Rodney Waldhoff
  */
-abstract class BaseBinaryPredicateList implements BinaryPredicate, Serializable {
+abstract class BaseBinaryPredicateList<L, R> implements BinaryPredicate<L, R>, Serializable {
 
     // attributes
     // ------------------------------------------------------------------------
-    private List list = new ArrayList();
+    private List<BinaryPredicate<? super L, ? super R>> list = new ArrayList<BinaryPredicate<? super L, ? super R>>();
 
     // constructor
     // ------------------------------------------------------------------------
@@ -55,7 +55,7 @@
      * Create a new BaseBinaryPredicateList.
      * @param p BinaryPredicate to add
      */
-    protected BaseBinaryPredicateList(BinaryPredicate p) {
+    protected BaseBinaryPredicateList(BinaryPredicate<? super L, ? super R> p) {
         addBinaryPredicate(p);
     }
 
@@ -64,7 +64,7 @@
      * @param p BinaryPredicate to add
      * @param q BinaryPredicate to add
      */
-    protected BaseBinaryPredicateList(BinaryPredicate p, BinaryPredicate q) {
+    protected BaseBinaryPredicateList(BinaryPredicate<? super L, ? super R> p, BinaryPredicate<? super L, ? super R> q) {
         addBinaryPredicate(p);
         addBinaryPredicate(q);
     }
@@ -75,7 +75,7 @@
      * @param q BinaryPredicate to add
      * @param r BinaryPredicate to add
      */
-    protected BaseBinaryPredicateList(BinaryPredicate p, BinaryPredicate q, BinaryPredicate r) {
+    protected BaseBinaryPredicateList(BinaryPredicate<? super L, ? super R> p, BinaryPredicate<? super L, ? super R> q, BinaryPredicate<? super L, ? super R> r) {
         addBinaryPredicate(p);
         addBinaryPredicate(q);
         addBinaryPredicate(r);
@@ -98,18 +98,13 @@
      */
     public abstract String toString();
 
-    /**
-     * {@inheritDoc}
-     */
-    public abstract boolean test(Object left, Object right);
-
     // modifiers
     // ------------------------------------------------------------------------
     /**
      * Add a BinaryPredicate to the list
      * @param p BinaryPredicate to add
      */
-    protected void addBinaryPredicate(BinaryPredicate p) {
+    protected void addBinaryPredicate(BinaryPredicate<? super L, ? super R> p) {
         list.add(p);
     }
 
@@ -119,7 +114,7 @@
      * Get an Iterator over the list contents.
      * @return Iterator
      */
-    protected Iterator getBinaryPredicateIterator() {
+    protected Iterator<BinaryPredicate<? super L, ? super R>> getBinaryPredicateIterator() {
         return list.iterator();
     }
 
@@ -128,7 +123,7 @@
      * @param that BaseBinaryPredicateList to test
      * @return boolean
      */
-    protected boolean getBinaryPredicateListEquals(BaseBinaryPredicateList that) {
+    protected boolean getBinaryPredicateListEquals(BaseBinaryPredicateList<?, ?> that) {
         return (null != that && this.list.equals(that.list));
     }
 

Modified: commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BasePredicateList.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BasePredicateList.java?rev=665786&r1=665785&r2=665786&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BasePredicateList.java (original)
+++ commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BasePredicateList.java Mon Jun  9 10:17:39 2008
@@ -40,7 +40,7 @@
 abstract class BasePredicateList implements Predicate, Serializable {
     // attributes
     // ------------------------------------------------------------------------
-    private List list = new ArrayList();
+    private List<Predicate> list = new ArrayList<Predicate>();
 
     // constructor
     // ------------------------------------------------------------------------
@@ -97,11 +97,6 @@
      */
     public abstract String toString();
 
-    /**
-     * {@inheritDoc}
-     */
-    public abstract boolean test();
-
     // modifiers
     // ------------------------------------------------------------------------
     /**
@@ -118,7 +113,7 @@
      * Get an Iterator over the contents of the list.
      * @return Iterator<Predicate>
      */
-    protected Iterator getPredicateIterator() {
+    protected Iterator<Predicate> getPredicateIterator() {
         return list.iterator();
     }
 

Modified: commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BaseUnaryPredicateList.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BaseUnaryPredicateList.java?rev=665786&r1=665785&r2=665786&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BaseUnaryPredicateList.java (original)
+++ commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BaseUnaryPredicateList.java Mon Jun  9 10:17:39 2008
@@ -37,11 +37,11 @@
  * @version $Revision$ $Date$
  * @author Rodney Waldhoff
  */
-abstract class BaseUnaryPredicateList implements UnaryPredicate, Serializable {
+abstract class BaseUnaryPredicateList<A> implements UnaryPredicate<A>, Serializable {
 
     // attributes
     // ------------------------------------------------------------------------
-    private List list = new ArrayList();
+    private List<UnaryPredicate<? super A>> list = new ArrayList<UnaryPredicate<? super A>>();
 
     // constructor
     // ------------------------------------------------------------------------
@@ -55,7 +55,7 @@
      * Create a new BaseUnaryPredicateList.
      * @param p single Predicate to add
      */
-    protected BaseUnaryPredicateList(UnaryPredicate p) {
+    protected BaseUnaryPredicateList(UnaryPredicate<? super A> p) {
         addUnaryPredicate(p);
     }
 
@@ -64,7 +64,7 @@
      * @param p Predicate to add
      * @param q Predicate to add
      */
-    protected BaseUnaryPredicateList(UnaryPredicate p, UnaryPredicate q) {
+    protected BaseUnaryPredicateList(UnaryPredicate<? super A> p, UnaryPredicate<? super A> q) {
         addUnaryPredicate(p);
         addUnaryPredicate(q);
     }
@@ -75,7 +75,7 @@
      * @param q Predicate to add
      * @param r Predicate to add
      */
-    protected BaseUnaryPredicateList(UnaryPredicate p, UnaryPredicate q, UnaryPredicate r) {
+    protected BaseUnaryPredicateList(UnaryPredicate<? super A> p, UnaryPredicate<? super A> q, UnaryPredicate<? super A> r) {
         addUnaryPredicate(p);
         addUnaryPredicate(q);
         addUnaryPredicate(r);
@@ -98,18 +98,13 @@
      */
     public abstract String toString();
 
-    /**
-     * {@inheritDoc}
-     */
-    public abstract boolean test(Object obj);
-
     // modifiers
     // ------------------------------------------------------------------------
     /**
      * Add a UnaryPredicate to the list
      * @param p UnaryPredicate to add
      */
-    protected void addUnaryPredicate(UnaryPredicate p) {
+    protected void addUnaryPredicate(UnaryPredicate<? super A> p) {
         list.add(p);
     }
 
@@ -119,7 +114,7 @@
      * Get an Iterator over the contained UnaryPredicates.
      * @return Iterator
      */
-    protected Iterator getUnaryPredicateIterator() {
+    protected Iterator<UnaryPredicate<? super A>> getUnaryPredicateIterator() {
         return list.iterator();
     }
 
@@ -128,7 +123,7 @@
      * @param that the BaseUnaryPredicateList to test
      * @return boolean
      */
-    protected boolean getUnaryPredicateListEquals(BaseUnaryPredicateList that) {
+    protected boolean getUnaryPredicateListEquals(BaseUnaryPredicateList<?> that) {
         return (null != that && this.list.equals(that.list));
     }
 

Modified: commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BinaryAnd.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BinaryAnd.java?rev=665786&r1=665785&r2=665786&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BinaryAnd.java (original)
+++ commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BinaryAnd.java Mon Jun  9 10:17:39 2008
@@ -36,7 +36,7 @@
  * @version $Revision$ $Date$
  * @author Rodney Waldhoff
  */
-public final class BinaryAnd extends BaseBinaryPredicateList {
+public final class BinaryAnd<L, R> extends BaseBinaryPredicateList<L, R> {
 
     // constructor
     // ------------------------------------------------------------------------
@@ -51,7 +51,7 @@
      * Create a new BinaryAnd.
      * @param p BinaryPredicate to add
      */
-    public BinaryAnd(BinaryPredicate p) {
+    public BinaryAnd(BinaryPredicate<? super L, ? super R> p) {
         super(p);
     }
 
@@ -60,7 +60,7 @@
      * @param p BinaryPredicate to add
      * @param q BinaryPredicate to add
      */
-    public BinaryAnd(BinaryPredicate p, BinaryPredicate q) {
+    public BinaryAnd(BinaryPredicate<? super L, ? super R> p, BinaryPredicate<? super L, ? super R> q) {
         super(p, q);
     }
 
@@ -70,7 +70,8 @@
      * @param q BinaryPredicate to add
      * @param r BinaryPredicate to add
      */
-    public BinaryAnd(BinaryPredicate p, BinaryPredicate q, BinaryPredicate r) {
+    public BinaryAnd(BinaryPredicate<? super L, ? super R> p, BinaryPredicate<? super L, ? super R> q,
+            BinaryPredicate<? super L, ? super R> r) {
         super(p, q, r);
     }
 
@@ -81,7 +82,7 @@
      * @param p BinaryPredicate to add
      * @return this
      */
-    public BinaryAnd and(BinaryPredicate p) {
+    public BinaryAnd<L, R> and(BinaryPredicate<? super L, ? super R> p) {
         super.addBinaryPredicate(p);
         return this;
     }
@@ -91,9 +92,9 @@
     /**
      * {@inheritDoc}
      */
-    public boolean test(Object a, Object b) {
-        for (Iterator iter = getBinaryPredicateIterator(); iter.hasNext();) {
-            if (!((BinaryPredicate) iter.next()).test(a, b)) {
+    public boolean test(L a, R b) {
+        for (Iterator<BinaryPredicate<? super L, ? super R>> iter = getBinaryPredicateIterator(); iter.hasNext();) {
+            if (!iter.next().test(a, b)) {
                 return false;
             }
         }
@@ -104,7 +105,7 @@
      * {@inheritDoc}
      */
     public boolean equals(Object that) {
-        return that == this || (that instanceof BinaryAnd && equals((BinaryAnd) that));
+        return that == this || (that instanceof BinaryAnd && equals((BinaryAnd<?, ?>) that));
     }
 
     /**
@@ -112,7 +113,7 @@
      * @param that the BinaryAnd to test
      * @return boolean
      */
-    public boolean equals(BinaryAnd that) {
+    public boolean equals(BinaryAnd<?, ?> that) {
         return getBinaryPredicateListEquals(that);
     }
 

Modified: commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BinaryCompositeBinaryFunction.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BinaryCompositeBinaryFunction.java?rev=665786&r1=665785&r2=665786&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BinaryCompositeBinaryFunction.java (original)
+++ commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BinaryCompositeBinaryFunction.java Mon Jun  9 10:17:39 2008
@@ -36,25 +36,56 @@
  * @version $Revision$ $Date$
  * @author Rodney Waldhoff
  */
-public class BinaryCompositeBinaryFunction implements BinaryFunction, Serializable {
-    // attributes
-    // ------------------------------------------------------------------------
-    private BinaryFunction binary = null;
-    private BinaryFunction leftBinary = null;
-    private BinaryFunction rightBinary = null;
+public class BinaryCompositeBinaryFunction<L, R, T> implements BinaryFunction<L, R, T>, Serializable {
+
+    /**
+     * Type-remembering Helper
+     *
+     * @param <G>
+     * @param <H>
+     */
+    private class Helper<G, H> implements BinaryFunction<L, R, T>, Serializable {
+        private BinaryFunction<? super G, ? super H, ? extends T> f;
+        private BinaryFunction<? super L, ? super R, ? extends G> g;
+        private BinaryFunction<? super L, ? super R, ? extends H> h;
+
+        /**
+         * Create a new Helper.
+         * @param f final BinaryFunction to evaluate
+         * @param g left preceding BinaryFunction
+         * @param h right preceding BinaryFunction
+         */
+        public Helper(BinaryFunction<? super G, ? super H, ? extends T> f,
+                BinaryFunction<? super L, ? super R, ? extends G> g, BinaryFunction<? super L, ? super R, ? extends H> h) {
+            this.f = f;
+            this.g = g;
+            this.h = h;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public T evaluate(L left, R right) {
+            return f.evaluate(g.evaluate(left, right), h.evaluate(left, right));
+        }
+    }
+
+    private Helper<?, ?> helper;
 
     // constructor
     // ------------------------------------------------------------------------
     /**
      * Create a new BinaryCompositeBinaryFunction.
-     * @param f function
-     * @param g function
-     * @param h function
-     */
-    public BinaryCompositeBinaryFunction(BinaryFunction f, BinaryFunction g, BinaryFunction h) {
-        binary = f;
-        leftBinary = g;
-        rightBinary = h;
+     * @param f final BinaryFunction to evaluate
+     * @param g left preceding BinaryFunction
+     * @param h right preceding BinaryFunction
+     */
+    public <G, H> BinaryCompositeBinaryFunction(BinaryFunction<? super G, ? super H, ? extends T> f,
+            BinaryFunction<? super L, ? super R, ? extends G> g, BinaryFunction<? super L, ? super R, ? extends H> h) {
+        if (f == null || g == null || h == null) {
+            throw new IllegalArgumentException("BinaryFunction arguments may not be null");
+        }
+        this.helper = new Helper<G, H>(f, g, h);
     }
 
     // function interface
@@ -62,8 +93,8 @@
     /**
      * {@inheritDoc}
      */
-    public Object evaluate(Object left, Object right) {
-        return binary.evaluate(leftBinary.evaluate(left, right), rightBinary.evaluate(left, right));
+    public T evaluate(L left, R right) {
+        return helper.evaluate(left, right);
     }
 
     /**
@@ -71,7 +102,7 @@
      */
     public boolean equals(Object that) {
         return that == this
-                || (that instanceof BinaryCompositeBinaryFunction && equals((BinaryCompositeBinaryFunction) that));
+                || (that instanceof BinaryCompositeBinaryFunction && equals((BinaryCompositeBinaryFunction<?, ?, ?>) that));
     }
 
     /**
@@ -79,11 +110,11 @@
      * @param that BinaryCompositeBinaryFunction to test
      * @return boolean
      */
-    public boolean equals(BinaryCompositeBinaryFunction that) {
-        return (null != that)
-                && (null == binary ? null == that.binary : binary.equals(that.binary))
-                && (null == leftBinary ? null == that.leftBinary : leftBinary.equals(that.leftBinary))
-                && (null == rightBinary ? null == that.rightBinary : rightBinary.equals(that.rightBinary));
+    public boolean equals(BinaryCompositeBinaryFunction<?, ?, ?> that) {
+        return null != that
+                && helper.f.equals(that.helper.f)
+                && helper.g.equals(that.helper.g)
+                && helper.h.equals(that.helper.h);
     }
 
     /**
@@ -91,18 +122,12 @@
      */
     public int hashCode() {
         int hash = "BinaryCompositeBinaryFunction".hashCode();
-        if (null != binary) {
             hash <<= 4;
-            hash ^= binary.hashCode();
-        }
-        if (null != leftBinary) {
+            hash ^= helper.f.hashCode();
             hash <<= 4;
-            hash ^= leftBinary.hashCode();
-        }
-        if (null != rightBinary) {
+            hash ^= helper.g.hashCode();
             hash <<= 4;
-            hash ^= rightBinary.hashCode();
-        }
+            hash ^= helper.h.hashCode();
         return hash;
     }
 
@@ -110,7 +135,7 @@
      * {@inheritDoc}
      */
     public String toString() {
-        return "BinaryCompositeBinaryFunction<" + binary + ";" + leftBinary + ";" + rightBinary + ">";
+        return "BinaryCompositeBinaryFunction<" + helper.f + ";" + helper.g + ";" + helper.h + ">";
     }
 
 }

Modified: commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BinaryNot.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BinaryNot.java?rev=665786&r1=665785&r2=665786&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BinaryNot.java (original)
+++ commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BinaryNot.java Mon Jun  9 10:17:39 2008
@@ -34,10 +34,10 @@
  * @version $Revision$ $Date$
  * @author Rodney Waldhoff
  */
-public final class BinaryNot implements BinaryPredicate, Serializable {
+public final class BinaryNot<L, R> implements BinaryPredicate<L, R>, Serializable {
     // attributes
     // ------------------------------------------------------------------------
-    private BinaryPredicate predicate = null;
+    private BinaryPredicate<? super L, ? super R> predicate = null;
 
     // constructor
     // ------------------------------------------------------------------------
@@ -45,7 +45,7 @@
      * Create a new BinaryNot.
      * @param p BinaryPredicate to negate
      */
-    public BinaryNot(BinaryPredicate p) {
+    public BinaryNot(BinaryPredicate<? super L, ? super R> p) {
         this.predicate = p;
     }
 
@@ -54,7 +54,7 @@
     /**
      * {@inheritDoc}
      */
-    public boolean test(Object left, Object right) {
+    public boolean test(L left, R right) {
         return !(predicate.test(left, right));
     }
 
@@ -62,7 +62,7 @@
      * {@inheritDoc}
      */
     public boolean equals(Object that) {
-        return that == this || (that instanceof BinaryNot && equals((BinaryNot) that));
+        return that == this || (that instanceof BinaryNot && equals((BinaryNot<?, ?>) that));
     }
 
     /**
@@ -70,7 +70,7 @@
      * @param that BinaryNot to test
      * @return boolean
      */
-    public boolean equals(BinaryNot that) {
+    public boolean equals(BinaryNot<?, ?> that) {
         return null != that && (null == predicate ? null == that.predicate : predicate.equals(that.predicate));
     }
 
@@ -99,8 +99,8 @@
      * @param that BinaryPredicate to negate
      * @return BinaryPredicate
      */
-    public static BinaryPredicate not(BinaryPredicate that) {
-        return null == that ? null : new BinaryNot(that);
+    public static <L, R> BinaryPredicate<L, R> not(BinaryPredicate<? super L, ? super R> that) {
+        return null == that ? null : new BinaryNot<L, R>(that);
     }
 
 }

Modified: commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BinaryOr.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BinaryOr.java?rev=665786&r1=665785&r2=665786&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BinaryOr.java (original)
+++ commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BinaryOr.java Mon Jun  9 10:17:39 2008
@@ -36,7 +36,7 @@
  * @version $Revision$ $Date$
  * @author Rodney Waldhoff
  */
-public final class BinaryOr extends BaseBinaryPredicateList {
+public final class BinaryOr<L, R> extends BaseBinaryPredicateList<L, R> {
 
     // constructor
     // ------------------------------------------------------------------------
@@ -51,7 +51,7 @@
      * Create a new BinaryOr.
      * @param p BinaryPredicate to add
      */
-    public BinaryOr(BinaryPredicate p) {
+    public BinaryOr(BinaryPredicate<? super L, ? super R> p) {
         super(p);
     }
 
@@ -60,7 +60,7 @@
      * @param p BinaryPredicate to add
      * @param q BinaryPredicate to add
      */
-    public BinaryOr(BinaryPredicate p, BinaryPredicate q) {
+    public BinaryOr(BinaryPredicate<? super L, ? super R> p, BinaryPredicate<? super L, ? super R> q) {
         super(p, q);
     }
 
@@ -70,7 +70,8 @@
      * @param q BinaryPredicate to add
      * @param r BinaryPredicate to add
      */
-    public BinaryOr(BinaryPredicate p, BinaryPredicate q, BinaryPredicate r) {
+    public BinaryOr(BinaryPredicate<? super L, ? super R> p, BinaryPredicate<? super L, ? super R> q,
+            BinaryPredicate<? super L, ? super R> r) {
         super(p, q, r);
     }
 
@@ -81,7 +82,7 @@
      * @param p BinaryPredicate to add
      * @return this
      */
-    public BinaryOr or(BinaryPredicate p) {
+    public BinaryOr<L, R> or(BinaryPredicate<? super L, ? super R> p) {
         super.addBinaryPredicate(p);
         return this;
     }
@@ -91,9 +92,9 @@
     /**
      * {@inheritDoc}
      */
-    public boolean test(Object a, Object b) {
-        for (Iterator iter = getBinaryPredicateIterator(); iter.hasNext();) {
-            if (((BinaryPredicate) iter.next()).test(a, b)) {
+    public boolean test(L a, R b) {
+        for (Iterator<BinaryPredicate<? super L, ? super R>> iter = getBinaryPredicateIterator(); iter.hasNext();) {
+            if (iter.next().test(a, b)) {
                 return true;
             }
         }
@@ -104,7 +105,7 @@
      * {@inheritDoc}
      */
     public boolean equals(Object that) {
-        return that == this || (that instanceof BinaryOr && equals((BinaryOr) that));
+        return that == this || (that instanceof BinaryOr && equals((BinaryOr<?, ?>) that));
     }
 
     /**
@@ -112,7 +113,7 @@
      * @param that BinaryOr to test
      * @return boolean
      */
-    public boolean equals(BinaryOr that) {
+    public boolean equals(BinaryOr<?, ?> that) {
         return getBinaryPredicateListEquals(that);
     }
 

Modified: commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BinarySequence.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BinarySequence.java?rev=665786&r1=665785&r2=665786&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BinarySequence.java (original)
+++ commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/BinarySequence.java Mon Jun  9 10:17:39 2008
@@ -41,10 +41,10 @@
  * @version $Revision$ $Date$
  * @author Rodney Waldhoff
  */
-public class BinarySequence implements BinaryProcedure, Serializable {
+public class BinarySequence<L, R> implements BinaryProcedure<L, R>, Serializable {
     // attributes
     // ------------------------------------------------------------------------
-    private List list = new ArrayList();
+    private List<BinaryProcedure<? super L, ? super R>> list = new ArrayList<BinaryProcedure<? super L, ? super R>>();
 
     // constructor
     // ------------------------------------------------------------------------
@@ -58,7 +58,7 @@
      * Create a new BinarySequence.
      * @param p BinaryProcedure to add
      */
-    public BinarySequence(BinaryProcedure p) {
+    public BinarySequence(BinaryProcedure<? super L, ? super R> p) {
         then(p);
     }
 
@@ -67,7 +67,7 @@
      * @param p BinaryProcedure to add
      * @param q BinaryProcedure to add
      */
-    public BinarySequence(BinaryProcedure p, BinaryProcedure q) {
+    public BinarySequence(BinaryProcedure<? super L, ? super R> p, BinaryProcedure<? super L, ? super R> q) {
         then(p);
         then(q);
     }
@@ -77,7 +77,7 @@
      * @param p BinaryProcedure to add
      * @return this
      */
-    public BinarySequence then(BinaryProcedure p) {
+    public BinarySequence<L, R> then(BinaryProcedure<? super L, ? super R> p) {
         list.add(p);
         return this;
     }
@@ -87,9 +87,9 @@
     /**
      * {@inheritDoc}
      */
-    public void run(Object left, Object right) {
-        for (ListIterator iter = list.listIterator(list.size()); iter.hasPrevious();) {
-            ((BinaryProcedure) iter.previous()).run(left, right);
+    public void run(L left, R right) {
+        for (ListIterator<BinaryProcedure<? super L, ? super R>> iter = list.listIterator(list.size()); iter.hasPrevious();) {
+            iter.previous().run(left, right);
         }
     }
 
@@ -97,7 +97,7 @@
      * {@inheritDoc}
      */
     public boolean equals(Object that) {
-        return that == this || (that instanceof BinarySequence && equals((BinarySequence) that));
+        return that == this || (that instanceof BinarySequence && equals((BinarySequence<?, ?>) that));
     }
 
     /**
@@ -105,7 +105,7 @@
      * @param that BinarySequence to test
      * @return boolean
      */
-    public boolean equals(BinarySequence that) {
+    public boolean equals(BinarySequence<?, ?> that) {
         // by construction, list is never null
         return null != that && list.equals(that.list);
     }

Modified: commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/Composite.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/Composite.java?rev=665786&r1=665785&r2=665786&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/Composite.java (original)
+++ commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/Composite.java Mon Jun  9 10:17:39 2008
@@ -23,7 +23,7 @@
 import org.apache.commons.functor.UnaryProcedure;
 
 /**
- * Utility methods for creating composite functors.
+ * Utility/fluent methods for creating composite functors.
  * @version $Revision$ $Date$
  * @author Rodney Waldhoff
  */
@@ -37,33 +37,64 @@
 
     /**
      * Create a composite UnaryProcedure.
-     * @param p UnaryProcedure to execute against output of <code>f</code>
-     * @param f UnaryFunction to apply
-     * @return UnaryProcedure
+     * @param procedure UnaryProcedure to execute against output of <code>f</code>
+     * @return CompositeUnaryProcedure<A>
      */
-    public static final UnaryProcedure procedure(UnaryProcedure p, UnaryFunction f) {
-        return new CompositeUnaryProcedure(p, f);
+    public static final <A> CompositeUnaryProcedure<A> procedure(UnaryProcedure<? super A> procedure) {
+        return new CompositeUnaryProcedure<A>(procedure);
+    }
+
+    /**
+     * Create a composite UnaryProcedure.
+     * @param procedure UnaryProcedure to execute against output of <code>f</code>
+     * @param function UnaryFunction to apply
+     * @return CompositeUnaryProcedure<A>
+     */
+    public static final <A, T> CompositeUnaryProcedure<A> procedure(UnaryProcedure<? super T> procedure,
+            UnaryFunction<? super A, ? extends T> function) {
+        return new CompositeUnaryProcedure<T>(procedure).of(function);
     }
 
     /**
      * Create a composite UnaryPredicate.
-     * @param p UnaryPredicate to test the output of <code>f</code>
-     * @param f UnaryFunction to apply
-     * @return UnaryPredicate
+     * @param pred UnaryPredicate to test the output of <code>f</code>
+     * @return CompositeUnaryPredicate<A>
      */
-    public static final UnaryPredicate predicate(UnaryPredicate p, UnaryFunction f) {
-        return new CompositeUnaryPredicate(p, f);
+    public static final <A> CompositeUnaryPredicate<A> predicate(UnaryPredicate<? super A> pred) {
+        return new CompositeUnaryPredicate<A>(pred);
+    }
+
+    /**
+     * Create a composite UnaryPredicate.
+     * @param predicate UnaryPredicate to test the output of <code>f</code>
+     * @param function UnaryFunction to apply
+     * @return CompositeUnaryPredicate<A>
+     */
+    public static final <A, T> CompositeUnaryPredicate<A> predicate(UnaryPredicate<? super T> predicate,
+            UnaryFunction<? super A, ? extends T> function) {
+        return new CompositeUnaryPredicate<T>(predicate).of(function);
     }
 
     /**
      * Create a composite BinaryPredicate.
      * @param p BinaryPredicate to test <i>output(</i><code>f</code><i>), output(</i><code>g</code><i>)</i>
-     * @param f left UnaryFunction
-     * @param g right UnaryFunction
+     * @param g left UnaryFunction
+     * @param h right UnaryFunction
      * @return BinaryPredicate
      */
-    public static final BinaryPredicate predicate(BinaryPredicate p, UnaryFunction f, UnaryFunction g) {
-        return new UnaryCompositeBinaryPredicate(p, f, g);
+    public static final <L, R, G, H> UnaryCompositeBinaryPredicate<L, R> predicate(
+            BinaryPredicate<? super G, ? super H> p, UnaryFunction<? super L, ? extends G> g,
+            UnaryFunction<? super R, ? extends H> h) {
+        return new UnaryCompositeBinaryPredicate<L, R>(p, g, h);
+    }
+
+    /**
+     * Create a composite UnaryFunction.
+     * @param f UnaryFunction to apply to the output of <code>g</code>
+     * @return UnaryFunction
+     */
+    public static final <A, T> CompositeUnaryFunction<A, T> function(UnaryFunction<? super A, ? extends T> f) {
+        return new CompositeUnaryFunction<A, T>(f);
     }
 
     /**
@@ -72,10 +103,24 @@
      * @param g UnaryFunction to apply first
      * @return UnaryFunction
      */
-    public static final UnaryFunction function(UnaryFunction f, UnaryFunction g) {
-        return new CompositeUnaryFunction(f, g);
+    public static final <A, X, T> CompositeUnaryFunction<A, T> function(UnaryFunction<? super X, ? extends T> f, UnaryFunction<? super A, ? extends X> g) {
+        return new CompositeUnaryFunction<X, T>(f).of(g);
     }
 
+//    /**
+//     * Chain a BinaryFunction to a UnaryFunction.
+//     * @param <L>
+//     * @param <R>
+//     * @param <X>
+//     * @param <T>
+//     * @param f UnaryFunction to apply to the output of <code>g</code>
+//     * @param g BinaryFunction to apply first
+//     * @return BinaryFunction<L, R, T>
+//     */
+//    public static final <L, R, X, T> BinaryFunction<L, R, T> function(UnaryFunction<? super X, ? extends T> f, BinaryFunction<? super L, ? super R, ? extends X> g) {
+//        return new CompositeUnaryFunction<X, T>(f).of(g);
+//    }
+
     /**
      * Create a composite<UnaryFunction> BinaryFunction.
      * @param f BinaryFunction to apply to <i>output(</i><code>f</code><i>), output(</i><code>g</code><i>)</i>
@@ -83,8 +128,10 @@
      * @param h right UnaryFunction
      * @return BinaryFunction
      */
-    public static final BinaryFunction function(BinaryFunction f, UnaryFunction g, UnaryFunction h) {
-        return new UnaryCompositeBinaryFunction(f, g, h);
+    public static final <L, R, G, H, T> UnaryCompositeBinaryFunction<L, R, T> function(
+            BinaryFunction<? super G, ? super H, ? extends T> f, UnaryFunction<? super L, ? extends G> g,
+            UnaryFunction<? super R, ? extends H> h) {
+        return new UnaryCompositeBinaryFunction<L, R, T>(f, g, h);
     }
 
     /**
@@ -94,7 +141,9 @@
      * @param h right BinaryFunction
      * @return BinaryFunction
      */
-    public static final BinaryFunction function(BinaryFunction f, BinaryFunction g, BinaryFunction h) {
-        return new BinaryCompositeBinaryFunction(f, g, h);
+    public static final <L, R, G, H, T> BinaryCompositeBinaryFunction<L, R, T> function(
+            BinaryFunction<? super G, ? super H, ? extends T> f, BinaryFunction<? super L, ? super R, ? extends G> g,
+            BinaryFunction<? super L, ? super R, ? extends H> h) {
+        return new BinaryCompositeBinaryFunction<L, R, T>(f, g, h);
     }
 }

Modified: commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/CompositeUnaryFunction.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/CompositeUnaryFunction.java?rev=665786&r1=665785&r2=665786&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/CompositeUnaryFunction.java (original)
+++ commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/CompositeUnaryFunction.java Mon Jun  9 10:17:39 2008
@@ -17,9 +17,6 @@
 package org.apache.commons.functor.core.composite;
 
 import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.ListIterator;
 
 import org.apache.commons.functor.UnaryFunction;
 
@@ -49,67 +46,114 @@
  * </p>
  * @version $Revision$ $Date$
  * @author Rodney Waldhoff
+ * @author Matt Benson
  */
-public class CompositeUnaryFunction implements UnaryFunction, Serializable {
+public class CompositeUnaryFunction<A, T> implements UnaryFunction<A, T>, Serializable {
 
-    // attributes
-    // ------------------------------------------------------------------------
-    private List list = new ArrayList();
-
-    // constructor
-    // ------------------------------------------------------------------------
     /**
-     * Create a new CompositeUnaryFunction.
-     */
-    public CompositeUnaryFunction() {
+     * Encapsulates a double function evaluation.
+     * @param <A> argument type
+     * @param <X> intermediate type
+     * @param <T> return type
+     */
+    private class Helper<X> implements UnaryFunction<A, T>, Serializable {
+        private UnaryFunction<? super X, ? extends T> following;
+        private UnaryFunction<? super A, ? extends X> preceding;
+
+        /**
+         * Create a new Helper.
+         * @param following UnaryFunction<X, Y>
+         * @param preceding UnaryFunction<Y, Z>
+         */
+        public Helper(UnaryFunction<? super X, ? extends T> following, UnaryFunction<? super A, ? extends X> preceding) {
+            this.following = following;
+            this.preceding = preceding;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public T evaluate(A obj) {
+            return following.evaluate(preceding.evaluate(obj));
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public boolean equals(Object obj) {
+            return obj == this || obj instanceof Helper && equals((Helper<?>) obj);
+        }
+
+        private boolean equals(Helper<?> helper) {
+            return helper.following.equals(following) && helper.preceding.equals(preceding);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public int hashCode() {
+            int result = "CompositeUnaryFunction$Helper".hashCode();
+            result <<= 2;
+            result |= following.hashCode();
+            result <<= 2;
+            result |= preceding.hashCode();
+            return result;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public String toString() {
+            // TODO Auto-generated method stub
+            return following.toString() + " of " + preceding.toString();
+        }
     }
 
+    private UnaryFunction<? super A, ? extends T> function;
+
     /**
      * Create a new CompositeUnaryFunction.
-     * @param f UnaryFunction to add
+     * @param function UnaryFunction to call
      */
-    public CompositeUnaryFunction(UnaryFunction f) {
-        of(f);
+    public CompositeUnaryFunction(UnaryFunction<? super A, ? extends T> function) {
+        if (function == null) {
+            throw new IllegalArgumentException("function must not be null");
+        }
+        this.function = function;
     }
 
-    /**
-     * Create a new CompositeUnaryFunction.
-     * @param f UnaryFunction to add
-     * @param g UnaryFunction to add
-     */
-    public CompositeUnaryFunction(UnaryFunction f, UnaryFunction g) {
-        of(f);
-        of(g);
+    private <X> CompositeUnaryFunction(UnaryFunction<? super X, ? extends T> following, UnaryFunction<? super A, ? extends X> preceding) {
+        this.function = new Helper<X>(following, preceding);
     }
 
-    // modifiers
-    // ------------------------------------------------------------------------
     /**
-     * Fluently prepend a UnaryFunction to the chain.
-     * @param f UnaryFunction to prepend
-     * @return this
+     * {@inheritDoc}
      */
-    public CompositeUnaryFunction of(UnaryFunction f) {
-        list.add(f);
-        return this;
+    public T evaluate(A obj) {
+        return function.evaluate(obj);
     }
 
     /**
-     * {@inheritDoc}
+     * Fluently obtain a CompositeUnaryFunction that is "this function" applied to the specified preceding function.
+     * @param <P> argument type of the resulting function.
+     * @param preceding UnaryFunction
+     * @return CompositeUnaryFunction<P, T>
      */
-    public Object evaluate(Object obj) {
-        Object result = obj;
-        for (ListIterator iter = list.listIterator(list.size()); iter.hasPrevious();) {
-            result = ((UnaryFunction) iter.previous()).evaluate(result);
+    public <P> CompositeUnaryFunction<P, T> of(UnaryFunction<? super P, ? extends A> preceding) {
+        if (preceding == null) {
+            throw new IllegalArgumentException("preceding function was null");
         }
-        return result;
+        return new CompositeUnaryFunction<P, T>(function, preceding);
     }
 
     /**
      * {@inheritDoc}
      */
     public boolean equals(Object that) {
-        return that == this || (that instanceof CompositeUnaryFunction && equals((CompositeUnaryFunction) that));
+        return that == this || (that instanceof CompositeUnaryFunction && equals((CompositeUnaryFunction<?, ?>) that));
     }
 
     /**
@@ -117,9 +161,9 @@
      * @param that CompositeUnaryFunction to test
      * @return boolean
      */
-    public boolean equals(CompositeUnaryFunction that) {
+    public boolean equals(CompositeUnaryFunction<?, ?> that) {
         // by construction, list is never null
-        return null != that && list.equals(that.list);
+        return null != that && function.equals(that.function);
     }
 
     /**
@@ -127,14 +171,14 @@
      */
     public int hashCode() {
         // by construction, list is never null
-        return "CompositeUnaryFunction".hashCode() ^ list.hashCode();
+        return ("CompositeUnaryFunction".hashCode() << 4) ^ function.hashCode();
     }
 
     /**
      * {@inheritDoc}
      */
     public String toString() {
-        return "CompositeUnaryFunction<" + list + ">";
+        return "CompositeUnaryFunction<" + function + ">";
     }
 
 }

Modified: commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/CompositeUnaryPredicate.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/CompositeUnaryPredicate.java?rev=665786&r1=665785&r2=665786&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/CompositeUnaryPredicate.java (original)
+++ commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/CompositeUnaryPredicate.java Mon Jun  9 10:17:39 2008
@@ -20,6 +20,7 @@
 
 import org.apache.commons.functor.UnaryFunction;
 import org.apache.commons.functor.UnaryPredicate;
+import org.apache.commons.functor.adapter.UnaryPredicateUnaryFunction;
 
 /**
  * A {@link UnaryPredicate UnaryPredicate}
@@ -44,46 +45,41 @@
  * @version $Revision$ $Date$
  * @author Rodney Waldhoff
  */
-public final class CompositeUnaryPredicate implements UnaryPredicate, Serializable {
+public final class CompositeUnaryPredicate<A> implements UnaryPredicate<A>, Serializable {
     // attributes
     // ------------------------------------------------------------------------
-    private CompositeUnaryFunction function = null;
-    private UnaryPredicate predicate = null;
+    private CompositeUnaryFunction<? super A, Boolean> function = null;
 
     // constructor
     // ------------------------------------------------------------------------
     /**
      * Create a new CompositeUnaryPredicate.
-     * @param p UnaryPredicate against which the composite functions' output will be tested
+     * @param predicate UnaryPredicate against which the composite functions' output will be tested
      */
-    public CompositeUnaryPredicate(UnaryPredicate p) {
-        if (null == p) { throw new NullPointerException(); }
-        this.predicate = p;
-        this.function = new CompositeUnaryFunction();
+    public CompositeUnaryPredicate(UnaryPredicate<? super A> predicate) {
+        if (null == predicate) {
+            throw new IllegalArgumentException("predicate must not be null");
+        }
+        this.function = new CompositeUnaryFunction<A, Boolean>(new UnaryPredicateUnaryFunction<A>(predicate));
     }
 
     /**
      * Create a new CompositeUnaryPredicate.
-     * @param p UnaryPredicate against which the composite functions' output will be tested
-     * @param f UnaryFunction single UnaryFunction to apply
+     * @param function delegate
      */
-    public CompositeUnaryPredicate(UnaryPredicate p, UnaryFunction f) {
-        if (null == p) { throw new NullPointerException(); }
-        if (null == f) { throw new NullPointerException(); }
-        this.predicate = p;
-        this.function = new CompositeUnaryFunction(f);
+    private CompositeUnaryPredicate(CompositeUnaryFunction<? super A, Boolean> function) {
+        this.function = function;
     }
 
     // modifiers
     // ------------------------------------------------------------------------
     /**
-     * Fluently prepend a UnaryFunction to the chain.
-     * @param f UnaryFunction to prepend
-     * @return this
-     */
-    public CompositeUnaryPredicate of(UnaryFunction f) {
-        function.of(f);
-        return this;
+     * Fluently obtain a CompositeUnaryPredicate that applies our predicate to the result of the preceding function.
+     * @param preceding UnaryFunction
+     * @return CompositeUnaryPredicate<P>
+     */
+    public <P> CompositeUnaryPredicate<P> of(UnaryFunction<? super P, ? extends A> preceding) {
+        return new CompositeUnaryPredicate<P>(function.of(preceding));
     }
 
     // predicate interface
@@ -91,15 +87,15 @@
     /**
      * {@inheritDoc}
      */
-    public boolean test(Object obj) {
-        return predicate.test(function.evaluate(obj));
+    public boolean test(A obj) {
+        return function.evaluate(obj);
     }
 
     /**
      * {@inheritDoc}
      */
     public boolean equals(Object that) {
-        return that == this || (that instanceof CompositeUnaryPredicate && equals((CompositeUnaryPredicate) that));
+        return that == this || (that instanceof CompositeUnaryPredicate && equals((CompositeUnaryPredicate<?>) that));
     }
 
     /**
@@ -107,8 +103,8 @@
      * @param that CompositeUnaryPredicate to test
      * @return boolean
      */
-    public boolean equals(CompositeUnaryPredicate that) {
-        return null != that && predicate.equals(that.predicate) && function.equals(that.function);
+    public boolean equals(CompositeUnaryPredicate<?> that) {
+        return null != that && function.equals(that.function);
     }
 
     /**
@@ -117,8 +113,6 @@
     public int hashCode() {
         int hash = "CompositeUnaryPredicate".hashCode();
         hash <<= 2;
-        hash ^= predicate.hashCode();
-        hash <<= 2;
         hash ^= function.hashCode();
         return hash;
     }
@@ -127,7 +121,7 @@
      * {@inheritDoc}
      */
     public String toString() {
-        return "CompositeUnaryFunction<" + predicate + ";" + function + ">";
+        return "CompositeUnaryFunction<" + function + ">";
     }
 
 }

Modified: commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/CompositeUnaryProcedure.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/CompositeUnaryProcedure.java?rev=665786&r1=665785&r2=665786&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/CompositeUnaryProcedure.java (original)
+++ commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/CompositeUnaryProcedure.java Mon Jun  9 10:17:39 2008
@@ -20,6 +20,7 @@
 
 import org.apache.commons.functor.UnaryFunction;
 import org.apache.commons.functor.UnaryProcedure;
+import org.apache.commons.functor.adapter.UnaryProcedureUnaryFunction;
 
 /**
  * A {@link UnaryProcedure UnaryProcedure}
@@ -44,52 +45,37 @@
  * @version $Revision$ $Date$
  * @author Rodney Waldhoff
  */
-public final class CompositeUnaryProcedure implements UnaryProcedure, Serializable {
+public final class CompositeUnaryProcedure<A> implements UnaryProcedure<A>, Serializable {
     // attributes
     // ------------------------------------------------------------------------
-    private CompositeUnaryFunction function = null;
-    private UnaryProcedure procedure = null;
+    private CompositeUnaryFunction<? super A, Object> function = null;
 
     // constructor
     // ------------------------------------------------------------------------
     /**
      * Create a new CompositeUnaryProcedure.
-     * @param p final UnaryProcedure to run
+     * @param procedure final UnaryProcedure to run
      */
-    public CompositeUnaryProcedure(UnaryProcedure p) {
-        if (null == p) {
-            throw new NullPointerException();
+    public CompositeUnaryProcedure(UnaryProcedure<? super A> procedure) {
+        if (null == procedure) {
+            throw new IllegalArgumentException("procedure must not be null");
         }
-        this.procedure = p;
-        this.function = new CompositeUnaryFunction();
+        this.function = new CompositeUnaryFunction<A, Object>(new UnaryProcedureUnaryFunction<A, Object>(procedure));
     }
 
-    /**
-     * Create a new CompositeUnaryProcedure.
-     * @param p final UnaryProcedure to run
-     * @param f UnaryFunction to chain into <code>p</code>
-     */
-    public CompositeUnaryProcedure(UnaryProcedure p, UnaryFunction f) {
-        if (null == p) {
-            throw new NullPointerException();
-        }
-        if (null == f) {
-            throw new NullPointerException();
-        }
-        this.procedure = p;
-        this.function = new CompositeUnaryFunction(f);
+    private CompositeUnaryProcedure(CompositeUnaryFunction<? super A, Object> function) {
+        this.function = function;
     }
 
     // modifiers
     // ------------------------------------------------------------------------
     /**
-     * Fluently prepend a transformation to the chain.
-     * @param f UnaryFunction to prepend
-     * @return this
-     */
-    public CompositeUnaryProcedure of(UnaryFunction f) {
-        function.of(f);
-        return this;
+     * Fluently obtain a CompositeUnaryProcedure that runs our procedure against the result of the preceding function.
+     * @param preceding UnaryFunction
+     * @return CompositeUnaryProcedure<P>
+     */
+    public <T> CompositeUnaryProcedure<T> of(UnaryFunction<? super T, ? extends A> preceding) {
+        return new CompositeUnaryProcedure<T>(function.of(preceding));
     }
 
     // predicate interface
@@ -97,15 +83,15 @@
     /**
      * {@inheritDoc}
      */
-    public void run(Object obj) {
-        procedure.run(function.evaluate(obj));
+    public void run(A obj) {
+        function.evaluate(obj);
     }
 
     /**
      * {@inheritDoc}
      */
     public boolean equals(Object that) {
-        return that == this || (that instanceof CompositeUnaryProcedure && equals((CompositeUnaryProcedure) that));
+        return that == this || (that instanceof CompositeUnaryProcedure && equals((CompositeUnaryProcedure<?>) that));
     }
 
     /**
@@ -113,8 +99,8 @@
      * @param that CompositeUnaryProcedure to test
      * @return boolean
      */
-    public boolean equals(CompositeUnaryProcedure that) {
-        return null != that && procedure.equals(that.procedure) && function.equals(that.function);
+    public boolean equals(CompositeUnaryProcedure<?> that) {
+        return null != that && function.equals(that.function);
     }
 
     /**
@@ -123,8 +109,6 @@
     public int hashCode() {
         int hash = "CompositeUnaryProcedure".hashCode();
         hash <<= 2;
-        hash ^= procedure.hashCode();
-        hash <<= 2;
         hash ^= function.hashCode();
         return hash;
     }
@@ -133,7 +117,7 @@
      * {@inheritDoc}
      */
     public String toString() {
-        return "CompositeUnaryProcedure<" + procedure + ";" + function + ">";
+        return "CompositeUnaryProcedure<" + function + ">";
     }
 
 }

Modified: commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/Conditional.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/Conditional.java?rev=665786&r1=665785&r2=665786&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/Conditional.java (original)
+++ commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/core/composite/Conditional.java Mon Jun  9 10:17:39 2008
@@ -45,10 +45,11 @@
      * @param q if
      * @param r then
      * @param s else
-     * @return UnaryProcedure
+     * @return UnaryProcedure<A>
      */
-    public static final UnaryProcedure procedure(UnaryPredicate q, UnaryProcedure r, UnaryProcedure s) {
-        return new ConditionalUnaryProcedure(q, r, s);
+    public static final <A> UnaryProcedure<A> procedure(UnaryPredicate<? super A> q, UnaryProcedure<? super A> r,
+            UnaryProcedure<? super A> s) {
+        return new ConditionalUnaryProcedure<A>(q, r, s);
     }
 
     /**
@@ -56,10 +57,11 @@
      * @param q if
      * @param r then
      * @param s else
-     * @return UnaryFunction
+     * @return UnaryFunction<A, T>
      */
-    public static final UnaryFunction function(UnaryPredicate q, UnaryFunction r, UnaryFunction s) {
-        return new ConditionalUnaryFunction(q, r, s);
+    public static final <A, T> UnaryFunction<A, T> function(UnaryPredicate<? super A> q,
+            UnaryFunction<? super A, ? extends T> r, UnaryFunction<? super A, ? extends T> s) {
+        return new ConditionalUnaryFunction<A, T>(q, r, s);
     }
 
     /**
@@ -67,10 +69,11 @@
      * @param q if
      * @param r then
      * @param s else
-     * @return UnaryPredicate
+     * @return UnaryPredicate<A>
      */
-    public static final UnaryPredicate predicate(UnaryPredicate q, UnaryPredicate r, UnaryPredicate s) {
-        return new ConditionalUnaryPredicate(q, r, s);
+    public static final <A> UnaryPredicate<A> predicate(UnaryPredicate<? super A> q, UnaryPredicate<? super A> r,
+            UnaryPredicate<? super A> s) {
+        return new ConditionalUnaryPredicate<A>(q, r, s);
     }
 
     /**
@@ -78,10 +81,11 @@
      * @param q if
      * @param r then
      * @param s else
-     * @return BinaryProcedure
+     * @return BinaryProcedure<L, R>
      */
-    public static final BinaryProcedure procedure(BinaryPredicate q, BinaryProcedure r, BinaryProcedure s) {
-        return new ConditionalBinaryProcedure(q, r, s);
+    public static final <L, R> BinaryProcedure<L, R> procedure(BinaryPredicate<? super L, ? super R> q,
+            BinaryProcedure<? super L, ? super R> r, BinaryProcedure<? super L, ? super R> s) {
+        return new ConditionalBinaryProcedure<L, R>(q, r, s);
     }
 
     /**
@@ -89,10 +93,11 @@
      * @param q if
      * @param r then
      * @param s else
-     * @return BinaryFunction
+     * @return BinaryFunction<L, R, T>
      */
-    public static final BinaryFunction function(BinaryPredicate q, BinaryFunction r, BinaryFunction s) {
-        return new ConditionalBinaryFunction(q, r, s);
+    public static final <L, R, T> BinaryFunction<L, R, T> function(BinaryPredicate<? super L, ? super R> q,
+            BinaryFunction<? super L, ? super R, ? extends T> r, BinaryFunction<? super L, ? super R, ? extends T> s) {
+        return new ConditionalBinaryFunction<L, R, T>(q, r, s);
     }
 
     /**
@@ -100,10 +105,11 @@
      * @param q if
      * @param r then
      * @param s else
-     * @return BinaryPredicate
+     * @return BinaryPredicate<L, R>
      */
-    public static final BinaryPredicate predicate(BinaryPredicate q, BinaryPredicate r, BinaryPredicate s) {
-        return new ConditionalBinaryPredicate(q, r, s);
+    public static final <L, R> BinaryPredicate<L, R> predicate(BinaryPredicate<? super L, ? super R> q,
+            BinaryPredicate<? super L, ? super R> r, BinaryPredicate<? super L, ? super R> s) {
+        return new ConditionalBinaryPredicate<L, R>(q, r, s);
     }
 
 }