You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ki...@apache.org on 2013/08/19 04:51:42 UTC

svn commit: r1515264 [1/2] - in /commons/proper/functor/branches/generators-FUNCTOR-14/src: main/java/org/apache/commons/functor/generator/range/ main/java/org/apache/commons/functor/range/ test/java/org/apache/commons/functor/ test/java/org/apache/com...

Author: kinow
Date: Mon Aug 19 02:51:41 2013
New Revision: 1515264

URL: http://svn.apache.org/r1515264
Log:
Create ranges package and make it iterable and iterator, rather than a generator

Added:
    commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/
    commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/BoundType.java
    commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/CharacterRange.java
    commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/DoubleRange.java
    commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/Endpoint.java
    commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/FloatRange.java
    commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/IntegerRange.java
    commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/LongRange.java
    commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/NumericRange.java
    commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/Range.java
    commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/Ranges.java
    commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/package-info.java
    commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/range/
      - copied from r1515159, commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/generator/range/
Removed:
    commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/generator/range/
    commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/generator/range/
Modified:
    commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/TestAlgorithms.java
    commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/example/kata/two/TestBinaryChop.java
    commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/generator/TestFilteredGenerator.java
    commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/generator/loop/TestGenerateUntil.java
    commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/generator/loop/TestGenerateWhile.java
    commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/generator/loop/TestTransformedGenerator.java
    commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/generator/loop/TestUntilGenerate.java
    commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/generator/loop/TestWhileGenerate.java
    commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/range/TestCharacterRange.java
    commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/range/TestDoubleRange.java
    commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/range/TestEndpoint.java
    commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/range/TestFloatRange.java
    commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/range/TestIntegerRange.java
    commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/range/TestLongRange.java

Added: commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/BoundType.java
URL: http://svn.apache.org/viewvc/commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/BoundType.java?rev=1515264&view=auto
==============================================================================
--- commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/BoundType.java (added)
+++ commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/BoundType.java Mon Aug 19 02:51:41 2013
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.functor.range;
+
+/**
+ * Determine the bound type of a range.
+ *
+ * @see org.apache.commons.functor.generator.range.Range
+ * @see org.apache.commons.functor.generator.range.Endpoint
+ * @since 1.0
+ * @version $Revision: $ $Date: $
+ */
+public enum BoundType {
+    // values
+    // ---------------------------------------------------------------
+    /**
+     * Represents an <b>open</b> bound, which value <b>is not</b> included in
+     * the range.
+     */
+    OPEN,
+    /**
+     * Represents a <b>closed</b> bound, which value <b>is included</b> in the
+     * range.
+     */
+    CLOSED;
+
+}

Added: commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/CharacterRange.java
URL: http://svn.apache.org/viewvc/commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/CharacterRange.java?rev=1515264&view=auto
==============================================================================
--- commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/CharacterRange.java (added)
+++ commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/CharacterRange.java Mon Aug 19 02:51:41 2013
@@ -0,0 +1,351 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.functor.range;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.apache.commons.functor.BinaryFunction;
+import org.apache.commons.lang3.Validate;
+
+/**
+ * A generator for a range of characters.
+ *
+ * @since 1.0
+ * @version $Revision: $ $Date: $
+ */
+public final class CharacterRange implements Range<Character, Integer>, Iterable<Character>, Iterator<Character> {
+
+    // attributes
+    // ---------------------------------------------------------------
+    /**
+     * Default left bound type.
+     */
+    public static final BoundType DEFAULT_LEFT_BOUND_TYPE = BoundType.CLOSED;
+
+    /**
+     * Default right bound type.
+     */
+    public static final BoundType DEFAULT_RIGHT_BOUND_TYPE = BoundType.CLOSED;
+
+    /**
+     * Left limit.
+     */
+    private final Endpoint<Character> leftEndpoint;
+
+    /**
+     * Right limit.
+     */
+    private final Endpoint<Character> rightEndpoint;
+
+    /**
+     * Increment step.
+     */
+    private final int step;
+
+    /**
+     * Current value.
+     */
+    private char currentValue;
+
+    /**
+     * Calculate default step.
+     */
+    public static final BinaryFunction<Character, Character, Integer> DEFAULT_STEP
+        = new BinaryFunction<Character, Character, Integer>() {
+
+        public Integer evaluate(Character left, Character right) {
+            return left > right ? -1 : 1;
+        }
+    };
+
+    // constructors
+    // ---------------------------------------------------------------
+    /**
+     * Create a new CharacterRange.
+     *
+     * @param from start
+     * @param to end
+     */
+    public CharacterRange(char from, char to) {
+        this(from, to, DEFAULT_STEP.evaluate(from, to).intValue());
+    }
+
+    /**
+     * Create a new CharacterRange.
+     *
+     * @param from start
+     * @param to end
+     * @param step increment
+     */
+    public CharacterRange(char from, char to, int step) {
+        this(from, BoundType.CLOSED, to, BoundType.CLOSED, step);
+    }
+
+    /**
+     * Create a new CharacterRange.
+     *
+     * @param from start
+     * @param to end
+     */
+    public CharacterRange(Endpoint<Character> from, Endpoint<Character> to) {
+        this(from.getValue(), from.getBoundType(), to.getValue(), to.getBoundType(),
+                DEFAULT_STEP.evaluate(from.getValue(), to.getValue()));
+    }
+
+    /**
+     * Create a new CharacterRange.
+     *
+     * @param from start
+     * @param to end
+     * @param step increment
+     */
+    public CharacterRange(Endpoint<Character> from, Endpoint<Character> to, int step) {
+        this(from.getValue(), from.getBoundType(), to.getValue(), to.getBoundType(), step);
+    }
+
+    /**
+     * Create a new CharacterRange.
+     *
+     * @param from start
+     * @param leftBoundType type of left bound
+     * @param to end
+     * @param rightBoundType type of right bound
+     */
+    public CharacterRange(char from, BoundType leftBoundType, char to,
+                        BoundType rightBoundType) {
+        this(from, leftBoundType, to, rightBoundType, DEFAULT_STEP.evaluate(from, to));
+    }
+
+    /**
+     * Create a new CharacterRange.
+     *
+     * @param from start
+     * @param leftBoundType type of left bound
+     * @param to end
+     * @param rightBoundType type of right bound
+     * @param step increment
+     */
+    public CharacterRange(char from, BoundType leftBoundType, char to,
+                          BoundType rightBoundType, int step) {
+        this.leftEndpoint = Validate
+            .notNull(new Endpoint<Character>(from, leftBoundType),
+                     "Left Endpoint argument must not be null");
+        this.rightEndpoint = Validate
+            .notNull(new Endpoint<Character>(to, rightBoundType),
+                     "Right Endpoint argument must not be null");
+        this.step = step;
+        if (from != to && Integer.signum(step) != Integer.signum(to - from)) {
+            throw new IllegalArgumentException("Will never reach " + to
+                                               + " from " + from
+                                               + " using step " + step);
+        }
+        if (this.leftEndpoint.getBoundType() == BoundType.CLOSED) {
+            this.currentValue = this.leftEndpoint.getValue();
+        } else {
+            this.currentValue = (char) (this.leftEndpoint.getValue() + this.step);
+        }
+    }
+
+    // range methods
+    // ---------------------------------------------------------------
+    /**
+     * {@inheritDoc}
+     */
+    public Endpoint<Character> getLeftEndpoint() {
+        return this.leftEndpoint;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Endpoint<Character> getRightEndpoint() {
+        return this.rightEndpoint;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Integer getStep() {
+        return this.step;
+    }
+
+    // iterable, iterator methods
+    // ---------------------------------------------------------------
+    /**
+     * {@inheritDoc}
+     */
+    public boolean hasNext() {
+        final int to = this.rightEndpoint.getValue();
+        if (step < 0) {
+            if (this.rightEndpoint.getBoundType() == BoundType.CLOSED) {
+                return this.currentValue >= to;
+            } else {
+                return this.currentValue > to;
+            }
+        } else {
+            if (this.rightEndpoint.getBoundType() == BoundType.CLOSED) {
+                return this.currentValue <= to;
+            } else {
+                return this.currentValue < to;
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Character next() {
+        final int step = this.getStep();
+        final char r = this.currentValue;
+        this.currentValue += step;
+        return r;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void remove() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Iterator<Character> iterator() {
+        return this;
+    }
+
+    // object methods
+    // ---------------------------------------------------------------
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return "CharacterRange<" + this.leftEndpoint.toLeftString() + ", "
+                + this.rightEndpoint.toRightString() + ", " + step + ">";
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == this) {
+            return true;
+        }
+        if (!(obj instanceof CharacterRange)) {
+            return false;
+        }
+        CharacterRange that = (CharacterRange) obj;
+        return this.leftEndpoint.equals(that.leftEndpoint)
+                && this.rightEndpoint.equals(that.rightEndpoint)
+                && this.step == that.step;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int hashCode() {
+        int hash = "CharacterRange".hashCode();
+        hash <<= 2;
+        hash ^= this.leftEndpoint.getValue();
+        hash <<= 2;
+        hash ^= this.rightEndpoint.getValue();
+        hash <<= 2;
+        hash ^= this.step;
+        return hash;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isEmpty() {
+        double leftValue = this.getLeftEndpoint().getValue().charValue();
+        double rightValue = this.getRightEndpoint().getValue().charValue();
+        boolean closedLeft = this.getLeftEndpoint().getBoundType() == BoundType.CLOSED;
+        boolean closedRight = this.getRightEndpoint().getBoundType() == BoundType.CLOSED;
+        if (!closedLeft && !closedRight
+                && this.getLeftEndpoint().equals(this.getRightEndpoint())) {
+            return Boolean.TRUE;
+        }
+        double step = this.getStep().intValue();
+        if (step > 0.0) {
+            double firstValue = closedLeft ? leftValue : leftValue + step;
+            return closedRight ? firstValue > rightValue
+                              : firstValue >= rightValue;
+        } else {
+            double firstValue = closedLeft ? leftValue : leftValue + step;
+            return closedRight ? firstValue < rightValue
+                              : firstValue <= rightValue;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean contains(Character obj) {
+        if (obj == null) {
+            return Boolean.FALSE;
+        }
+        char leftValue = this.getLeftEndpoint().getValue().charValue();
+        char rightValue = this.getRightEndpoint().getValue().charValue();
+        boolean includeLeft = this.getLeftEndpoint().getBoundType() == BoundType.CLOSED;
+        boolean includeRight = this.getRightEndpoint().getBoundType() == BoundType.CLOSED;
+        int step = this.getStep().intValue();
+        int value = (int) obj.charValue();
+
+        int firstValue = 0;
+        int lastValue = 0;
+
+        if (step < 0.0) {
+            firstValue = includeLeft ? leftValue : leftValue + step;
+            lastValue = includeRight ? rightValue : rightValue + 1;
+            if (value > firstValue || value < lastValue) {
+                return Boolean.FALSE;
+            }
+        } else {
+            firstValue = includeLeft ? leftValue : leftValue + step;
+            lastValue = includeRight ? rightValue : rightValue - 1;
+            if (value < firstValue || value > lastValue) {
+                return Boolean.FALSE;
+            }
+        }
+        return ((double) (value - firstValue) / step + 1) % 1.0 == 0.0;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean containsAll(Collection<Character> col) {
+        if (col == null || col.size() == 0) {
+            return Boolean.FALSE;
+        }
+        boolean r = Boolean.TRUE;
+        for (Character t : col) {
+            if (!this.contains(t)) {
+                r = Boolean.FALSE;
+                break;
+            }
+        }
+        return r;
+    }
+
+}

Added: commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/DoubleRange.java
URL: http://svn.apache.org/viewvc/commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/DoubleRange.java?rev=1515264&view=auto
==============================================================================
--- commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/DoubleRange.java (added)
+++ commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/DoubleRange.java Mon Aug 19 02:51:41 2013
@@ -0,0 +1,286 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.functor.range;
+
+import java.util.Iterator;
+
+import org.apache.commons.functor.BinaryFunction;
+import org.apache.commons.lang3.Validate;
+
+/**
+ * A generator for a range of doubles.
+ *
+ * @since 1.0
+ * @version $Revision: $ $Date: $
+ */
+public class DoubleRange extends NumericRange<Double> implements Iterable<Double>, Iterator<Double> {
+
+    // attributes
+    // ---------------------------------------------------------------
+    /**
+     * Left limit.
+     */
+    private final Endpoint<Double> leftEndpoint;
+
+    /**
+     * Right limit.
+     */
+    private final Endpoint<Double> rightEndpoint;
+
+    /**
+     * Increment step.
+     */
+    private final double step;
+
+    /**
+     * Current value.
+     */
+    private double currentValue;
+
+    /**
+     * Calculate default step.
+     */
+    public static final BinaryFunction<Double, Double, Double> DEFAULT_STEP =
+            new BinaryFunction<Double, Double, Double>() {
+
+        public Double evaluate(Double left, Double right) {
+            return left > right ? -1.0d : 1.0d;
+        }
+    };
+
+    // constructors
+    // ---------------------------------------------------------------
+    /**
+     * Create a new DoubleRange.
+     *
+     * @param from start
+     * @param to end
+     */
+    public DoubleRange(Number from, Number to) {
+        this(from.doubleValue(), to.doubleValue());
+    }
+
+    /**
+     * Create a new DoubleRange.
+     *
+     * @param from start
+     * @param to end
+     * @param step increment
+     */
+    public DoubleRange(Number from, Number to, Number step) {
+        this(from.doubleValue(), to.doubleValue(), step.doubleValue());
+    }
+
+    /**
+     * Create a new DoubleRange.
+     *
+     * @param from start
+     * @param to end
+     */
+    public DoubleRange(double from, double to) {
+        this(from, to, DEFAULT_STEP.evaluate(from, to).intValue());
+    }
+
+    /**
+     * Create a new DoubleRange.
+     *
+     * @param from start
+     * @param to end
+     * @param step increment
+     */
+    public DoubleRange(double from, double to, double step) {
+        this(from, DEFAULT_LEFT_BOUND_TYPE, to, DEFAULT_RIGHT_BOUND_TYPE, step);
+    }
+
+    /**
+     * Create a new DoubleRange.
+     *
+     * @param from start
+     * @param to end
+     */
+    public DoubleRange(Endpoint<Double> from, Endpoint<Double> to) {
+        this(from.getValue(), from.getBoundType(), to.getValue(), to.getBoundType(),
+                DEFAULT_STEP.evaluate(from.getValue(), to.getValue()));
+    }
+
+    /**
+     * Create a new DoubleRange.
+     *
+     * @param from start
+     * @param leftBoundType type of left bound
+     * @param to end
+     * @param rightBoundType type of right bound
+     */
+    public DoubleRange(double from, BoundType leftBoundType, double to,
+                        BoundType rightBoundType) {
+        this(from, leftBoundType, to, rightBoundType, DEFAULT_STEP.evaluate(from, to));
+    }
+
+    /**
+     * Create a new DoubleRange.
+     *
+     * @param from start
+     * @param to end
+     * @param step increment
+     */
+    public DoubleRange(Endpoint<Double> from, Endpoint<Double> to, double step) {
+        this(from.getValue(), from.getBoundType(), to.getValue(), to.getBoundType(), step);
+    }
+
+    /**
+     * Create a new DoubleRange.
+     *
+     * @param from start
+     * @param leftBoundType type of left bound
+     * @param to end
+     * @param rightBoundType type of right bound
+     * @param step increment
+     */
+    public DoubleRange(double from, BoundType leftBoundType, double to,
+                       BoundType rightBoundType, double step) {
+        this.leftEndpoint = Validate
+            .notNull(new Endpoint<Double>(from, leftBoundType),
+                     "Left Endpoint argument must not be null");
+        this.rightEndpoint = Validate
+            .notNull(new Endpoint<Double>(to, rightBoundType),
+                     "Right Endpoint argument must not be null");
+        this.step = step;
+        if (from != to && Math.signum(step) != Math.signum(to - from)) {
+            throw new IllegalArgumentException("Will never reach " + to
+                                               + " from " + from
+                                               + " using step " + step);
+        }
+        if (this.leftEndpoint.getBoundType() == BoundType.CLOSED) {
+            this.currentValue = this.leftEndpoint.getValue();
+        } else {
+            this.currentValue = this.leftEndpoint.getValue() + this.step;
+        }
+    }
+
+    // range methods
+    // ---------------------------------------------------------------
+    /**
+     * {@inheritDoc}
+     */
+    public Endpoint<Double> getLeftEndpoint() {
+        return this.leftEndpoint;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Endpoint<Double> getRightEndpoint() {
+        return this.rightEndpoint;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Double getStep() {
+        return this.step;
+    }
+ // iterable, iterator methods
+    // ---------------------------------------------------------------
+    /**
+     * {@inheritDoc}
+     */
+    public boolean hasNext() {
+        final double to = this.rightEndpoint.getValue();
+        if (step < 0) {
+            if (this.rightEndpoint.getBoundType() == BoundType.CLOSED) {
+                return this.currentValue >= to;
+            } else {
+                return this.currentValue > to;
+            }
+        } else {
+            if (this.rightEndpoint.getBoundType() == BoundType.CLOSED) {
+                return this.currentValue <= to;
+            } else {
+                return this.currentValue < to;
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Double next() {
+        final double step = this.getStep();
+        final double r = this.currentValue;
+        this.currentValue += step;
+        return r;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void remove() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Iterator<Double> iterator() {
+        return this;
+    }
+
+    // object methods
+    // ---------------------------------------------------------------
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return "DoubleRange<" + this.leftEndpoint.toLeftString() + ", "
+                + this.rightEndpoint.toRightString() + ", " + this.step + ">";
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == this) {
+            return true;
+        }
+        if (!(obj instanceof DoubleRange)) {
+            return false;
+        }
+        DoubleRange that = (DoubleRange) obj;
+        return this.leftEndpoint.equals(that.leftEndpoint)
+                && this.rightEndpoint.equals(that.rightEndpoint)
+                && this.step == that.step;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int hashCode() {
+        int hash = "DoubleRange".hashCode();
+        hash <<= 2;
+        hash ^= this.leftEndpoint.getValue().hashCode();
+        hash <<= 2;
+        hash ^= this.rightEndpoint.getValue().hashCode();
+        hash <<= 2;
+        hash ^= Double.valueOf(this.step).hashCode();
+        return hash;
+    }
+
+}

Added: commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/Endpoint.java
URL: http://svn.apache.org/viewvc/commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/Endpoint.java?rev=1515264&view=auto
==============================================================================
--- commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/Endpoint.java (added)
+++ commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/Endpoint.java Mon Aug 19 02:51:41 2013
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.functor.range;
+
+/**
+ * Represent an endpoint of a range. This can be the left endpoint or the right
+ * endpoint. It is also called left limit or right limit, and can be open
+ * (exclusive, unbounded) or closed (inclusive, bounded).
+ *
+ * @param <T> type of the value held by this endpoint
+ * @since 1.0
+ * @version $Revision: $ $Date: $
+ */
+public class Endpoint<T extends Comparable<?>> {
+
+    /**
+     * The endpoint value.
+     */
+    private final T value;
+
+    /**
+     * The endpoint bound type.
+     */
+    private final BoundType boundType;
+
+    /**
+     * Create an endpoint.
+     *
+     * @param value value
+     * @param boundType bound type
+     */
+    public Endpoint(T value, BoundType boundType) {
+        this.value = value;
+        this.boundType = boundType;
+    }
+
+    /**
+     * @return Object
+     */
+    public T getValue() {
+        return value;
+    }
+
+    /**
+     * @return BoundType
+     */
+    public BoundType getBoundType() {
+        return boundType;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        String boundType = this.boundType == BoundType.OPEN ? "OPEN" : "CLOSED";
+        return "Endpoint<" + this.value + ", " + boundType + ">";
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == this) {
+            return true;
+        }
+        if (!(obj instanceof Endpoint)) {
+            return false;
+        }
+        Endpoint<?> that = (Endpoint<?>) obj;
+        return this.boundType == that.boundType
+                && this.value.equals(that.value);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int hashCode() {
+        int hash = "Endpoint".hashCode();
+        hash <<= 2;
+        hash ^= this.value.toString().hashCode();
+        hash <<= 2;
+        hash ^= Boolean.valueOf(this.boundType == BoundType.OPEN).hashCode();
+        return hash;
+    }
+
+    /**
+     * Print the left endpoint and bound type.
+     *
+     * @return String
+     */
+    public String toLeftString() {
+        return (this.boundType == BoundType.OPEN ? "(" : "[") + this.value;
+    }
+
+    /**
+     * Print the right endpoint and bound type.
+     *
+     * @return String
+     */
+    public String toRightString() {
+        return this.value + (this.boundType == BoundType.OPEN ? ")" : "]");
+    }
+
+}

Added: commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/FloatRange.java
URL: http://svn.apache.org/viewvc/commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/FloatRange.java?rev=1515264&view=auto
==============================================================================
--- commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/FloatRange.java (added)
+++ commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/FloatRange.java Mon Aug 19 02:51:41 2013
@@ -0,0 +1,286 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.functor.range;
+
+import java.util.Iterator;
+
+import org.apache.commons.functor.BinaryFunction;
+import org.apache.commons.lang3.Validate;
+
+/**
+ * A generator for a range of float.
+ *
+ * @since 1.0
+ * @version $Revision: $ $Date: $
+ */
+public class FloatRange extends NumericRange<Float> implements Iterable<Float>, Iterator<Float> {
+
+    // attributes
+    // ---------------------------------------------------------------
+    /**
+     * Left limit.
+     */
+    private final Endpoint<Float> leftEndpoint;
+
+    /**
+     * Right limit.
+     */
+    private final Endpoint<Float> rightEndpoint;
+
+    /**
+     * Increment step.
+     */
+    private final float step;
+
+    /**
+     * Current value.
+     */
+    private float currentValue;
+
+    /**
+     * Calculate default step.
+     */
+    public static final BinaryFunction<Float, Float, Float> DEFAULT_STEP = new BinaryFunction<Float, Float, Float>() {
+
+        public Float evaluate(Float left, Float right) {
+            return left > right ? -1.0f : 1.0f;
+        }
+    };
+
+    // constructors
+    // ---------------------------------------------------------------
+    /**
+     * Create a new FloatRange.
+     *
+     * @param from start
+     * @param to end
+     */
+    public FloatRange(Number from, Number to) {
+        this(from.floatValue(), to.floatValue());
+    }
+
+    /**
+     * Create a new FloatRange.
+     *
+     * @param from start
+     * @param to end
+     * @param step increment
+     */
+    public FloatRange(Number from, Number to, Number step) {
+        this(from.floatValue(), to.floatValue(), step.floatValue());
+    }
+
+    /**
+     * Create a new FloatRange.
+     *
+     * @param from start
+     * @param to end
+     */
+    public FloatRange(float from, float to) {
+        this(from, to, DEFAULT_STEP.evaluate(from, to).floatValue());
+    }
+
+    /**
+     * Create a new FloatRange.
+     *
+     * @param from start
+     * @param to end
+     * @param step increment
+     */
+    public FloatRange(float from, float to, float step) {
+        this(from, DEFAULT_LEFT_BOUND_TYPE, to, DEFAULT_RIGHT_BOUND_TYPE, step);
+    }
+
+    /**
+     * Create a new FloatRange.
+     *
+     * @param from start
+     * @param to end
+     */
+    public FloatRange(Endpoint<Float> from, Endpoint<Float> to) {
+        this(from.getValue(), from.getBoundType(), to.getValue(), to.getBoundType(),
+                DEFAULT_STEP.evaluate(from.getValue(), to.getValue()));
+    }
+
+    /**
+     * Create a new FloatRange.
+     *
+     * @param from start
+     * @param to end
+     * @param step increment
+     */
+    public FloatRange(Endpoint<Float> from, Endpoint<Float> to, float step) {
+        this(from.getValue(), from.getBoundType(), to.getValue(), to.getBoundType(), step);
+    }
+
+    /**
+     * Create a new FloatRange.
+     *
+     * @param from start
+     * @param leftBoundType type of left bound
+     * @param to end
+     * @param rightBoundType type of right bound
+     */
+    public FloatRange(float from, BoundType leftBoundType, float to,
+                        BoundType rightBoundType) {
+        this(from, leftBoundType, to, rightBoundType, DEFAULT_STEP.evaluate(from, to));
+    }
+
+    /**
+     * Create a new FloatRange.
+     *
+     * @param from start
+     * @param leftBoundType type of left bound
+     * @param to end
+     * @param rightBoundType type of right bound
+     * @param step increment
+     */
+    public FloatRange(float from, BoundType leftBoundType, float to,
+                      BoundType rightBoundType, float step) {
+        this.leftEndpoint = Validate
+            .notNull(new Endpoint<Float>(from, leftBoundType),
+                     "Left Endpoint argument must not be null");
+        this.rightEndpoint = Validate
+            .notNull(new Endpoint<Float>(to, rightBoundType),
+                     "Right Endpoint argument must not be null");
+        this.step = step;
+        if (from != to && Math.signum(step) != Math.signum(to - from)) {
+            throw new IllegalArgumentException("Will never reach " + to
+                                               + " from " + from
+                                               + " using step " + step);
+        }
+        if (this.leftEndpoint.getBoundType() == BoundType.CLOSED) {
+            this.currentValue = this.leftEndpoint.getValue();
+        } else {
+            this.currentValue = this.leftEndpoint.getValue() + this.step;
+        }
+    }
+
+    // range methods
+    // ---------------------------------------------------------------
+    /**
+     * {@inheritDoc}
+     */
+    public Endpoint<Float> getLeftEndpoint() {
+        return this.leftEndpoint;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Endpoint<Float> getRightEndpoint() {
+        return this.rightEndpoint;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Float getStep() {
+        return this.step;
+    }
+
+    // iterable, iterator methods
+    // ---------------------------------------------------------------
+    /**
+     * {@inheritDoc}
+     */
+    public boolean hasNext() {
+        final float to = this.rightEndpoint.getValue();
+        if (step < 0) {
+            if (this.rightEndpoint.getBoundType() == BoundType.CLOSED) {
+                return this.currentValue >= to;
+            } else {
+                return this.currentValue > to;
+            }
+        } else {
+            if (this.rightEndpoint.getBoundType() == BoundType.CLOSED) {
+                return this.currentValue <= to;
+            } else {
+                return this.currentValue < to;
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Float next() {
+        final float step = this.getStep();
+        final float r = this.currentValue;
+        this.currentValue += step;
+        return r;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void remove() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Iterator<Float> iterator() {
+        return this;
+    }
+
+    // object methods
+    // ---------------------------------------------------------------
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return "FloatRange<" + this.leftEndpoint.toLeftString() + ", "
+                + this.rightEndpoint.toRightString() + ", " + this.step + ">";
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == this) {
+            return true;
+        }
+        if (!(obj instanceof FloatRange)) {
+            return false;
+        }
+        FloatRange that = (FloatRange) obj;
+        return this.leftEndpoint.equals(that.leftEndpoint)
+                && this.rightEndpoint.equals(that.rightEndpoint)
+                && this.step == that.step;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int hashCode() {
+        int hash = "FloatRange".hashCode();
+        hash <<= 2;
+        hash ^= this.leftEndpoint.getValue().hashCode();
+        hash <<= 2;
+        hash ^= this.rightEndpoint.getValue().hashCode();
+        hash <<= 2;
+        hash ^= Float.valueOf(this.step).hashCode();
+        return hash;
+    }
+
+}

Added: commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/IntegerRange.java
URL: http://svn.apache.org/viewvc/commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/IntegerRange.java?rev=1515264&view=auto
==============================================================================
--- commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/IntegerRange.java (added)
+++ commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/IntegerRange.java Mon Aug 19 02:51:41 2013
@@ -0,0 +1,288 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.functor.range;
+
+import java.util.Iterator;
+
+import org.apache.commons.functor.BinaryFunction;
+import org.apache.commons.lang3.Validate;
+
+/**
+ * A range of integers.
+ *
+ * @since 1.0
+ * @version $Revision: 1385335 $ $Date: 2012-09-16 15:08:31 -0300 (Sun, 16 Sep 2012) $
+ */
+public class IntegerRange extends NumericRange<Integer> implements Iterable<Integer>, Iterator<Integer> {
+
+    // attributes
+    // ---------------------------------------------------------------
+    /**
+     * Left limit.
+     */
+    private final Endpoint<Integer> leftEndpoint;
+
+    /**
+     * Right limit.
+     */
+    private final Endpoint<Integer> rightEndpoint;
+
+    /**
+     * Increment step.
+     */
+    private final int step;
+
+    /**
+     * Current value.
+     */
+    private int currentValue;
+
+    /**
+     * Calculate default step.
+     */
+    public static final BinaryFunction<Integer, Integer, Integer> DEFAULT_STEP =
+            new BinaryFunction<Integer, Integer, Integer>() {
+
+        public Integer evaluate(Integer left, Integer right) {
+            return left > right ? -1 : 1;
+        }
+    };
+
+    // constructors
+    // ---------------------------------------------------------------
+    /**
+     * Create a new IntegerRange.
+     *
+     * @param from start
+     * @param to end
+     */
+    public IntegerRange(Number from, Number to) {
+        this(from.intValue(), to.intValue());
+    }
+
+    /**
+     * Create a new IntegerRange.
+     *
+     * @param from start
+     * @param to end
+     * @param step increment
+     */
+    public IntegerRange(Number from, Number to, Number step) {
+        this(from.intValue(), to.intValue(), step.intValue());
+    }
+
+    /**
+     * Create a new IntegerRange.
+     *
+     * @param from start
+     * @param to end
+     */
+    public IntegerRange(int from, int to) {
+        this(from, to, DEFAULT_STEP.evaluate(from, to).intValue());
+    }
+
+    /**
+     * Create a new IntegerRange.
+     *
+     * @param from start
+     * @param to end
+     * @param step increment
+     */
+    public IntegerRange(int from, int to, int step) {
+        this(from, DEFAULT_LEFT_BOUND_TYPE, to, DEFAULT_RIGHT_BOUND_TYPE, step);
+    }
+
+    /**
+     * Create a new IntegerRange.
+     *
+     * @param from start
+     * @param to end
+     */
+    public IntegerRange(Endpoint<Integer> from, Endpoint<Integer> to) {
+        this(from.getValue(), from.getBoundType(), to.getValue(), to.getBoundType(),
+                DEFAULT_STEP.evaluate(from.getValue(), to.getValue()));
+    }
+
+    /**
+     * Create a new IntegerRange.
+     *
+     * @param from start
+     * @param to end
+     * @param step increment
+     */
+    public IntegerRange(Endpoint<Integer> from, Endpoint<Integer> to, int step) {
+        this(from.getValue(), from.getBoundType(), to.getValue(), to.getBoundType(), step);
+    }
+
+    /**
+     * Create a new IntegerRange.
+     *
+     * @param from start
+     * @param leftBoundType type of left bound
+     * @param to end
+     * @param rightBoundType type of right bound
+     */
+    public IntegerRange(int from, BoundType leftBoundType, int to,
+                        BoundType rightBoundType) {
+        this(from, leftBoundType, to, rightBoundType, DEFAULT_STEP.evaluate(from, to));
+    }
+
+    /**
+     * Create a new IntegerRange.
+     *
+     * @param from start
+     * @param leftBoundType type of left bound
+     * @param to end
+     * @param rightBoundType type of right bound
+     * @param step increment
+     */
+    public IntegerRange(int from, BoundType leftBoundType, int to,
+                        BoundType rightBoundType, int step) {
+        this.leftEndpoint = Validate
+            .notNull(new Endpoint<Integer>(from, leftBoundType),
+                     "Left Endpoint argument must not be null");
+        this.rightEndpoint = Validate
+            .notNull(new Endpoint<Integer>(to, rightBoundType),
+                     "Right Endpoint argument must not be null");
+        this.step = step;
+        if (from != to && Integer.signum(step) != Integer.signum(to - from)) {
+            throw new IllegalArgumentException("Will never reach " + to
+                                               + " from " + from
+                                               + " using step " + step);
+        }
+        if (this.leftEndpoint.getBoundType() == BoundType.CLOSED) {
+            this.currentValue = this.leftEndpoint.getValue();
+        } else {
+            this.currentValue = this.leftEndpoint.getValue() + this.step;
+        }
+    }
+
+    // range methods
+    // ---------------------------------------------------------------
+    /**
+     * {@inheritDoc}
+     */
+    public Endpoint<Integer> getLeftEndpoint() {
+        return this.leftEndpoint;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Endpoint<Integer> getRightEndpoint() {
+        return this.rightEndpoint;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Integer getStep() {
+        return this.step;
+    }
+
+    // iterable, iterator methods
+    // ---------------------------------------------------------------
+    /**
+     * {@inheritDoc}
+     */
+    public boolean hasNext() {
+        final int to = this.rightEndpoint.getValue();
+        if (step < 0) {
+            if (this.rightEndpoint.getBoundType() == BoundType.CLOSED) {
+                return this.currentValue >= to;
+            } else {
+                return this.currentValue > to;
+            }
+        } else {
+            if (this.rightEndpoint.getBoundType() == BoundType.CLOSED) {
+                return this.currentValue <= to;
+            } else {
+                return this.currentValue < to;
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Integer next() {
+        final int step = this.getStep();
+        final int r = this.currentValue;
+        this.currentValue += step;
+        return r;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void remove() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Iterator<Integer> iterator() {
+        return this;
+    }
+
+    // object methods
+    // ---------------------------------------------------------------
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return "IntegerRange<" + this.leftEndpoint.toLeftString()
+                + ", " + this.rightEndpoint.toRightString()
+                + ", " + this.step + ">";
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == this) {
+            return true;
+        }
+        if (!(obj instanceof IntegerRange)) {
+            return false;
+        }
+        IntegerRange that = (IntegerRange) obj;
+        return this.leftEndpoint.equals(that.leftEndpoint)
+                && this.rightEndpoint.equals(that.rightEndpoint)
+                && this.step == that.step;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int hashCode() {
+        int hash = "IntegerRange".hashCode();
+        hash <<= 2;
+        hash ^= this.leftEndpoint.getValue();
+        hash <<= 2;
+        hash ^= this.rightEndpoint.getValue();
+        hash <<= 2;
+        hash ^= this.step;
+        return hash;
+    }
+
+}

Added: commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/LongRange.java
URL: http://svn.apache.org/viewvc/commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/LongRange.java?rev=1515264&view=auto
==============================================================================
--- commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/LongRange.java (added)
+++ commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/LongRange.java Mon Aug 19 02:51:41 2013
@@ -0,0 +1,295 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.functor.range;
+
+import java.util.Iterator;
+
+import org.apache.commons.functor.BinaryFunction;
+import org.apache.commons.lang3.Validate;
+
+/**
+ * A range of longs.
+ *
+ * @since 1.0
+ * @version $Revision: 1385335 $ $Date: 2012-09-16 15:08:31 -0300 (Sun, 16 Sep 2012) $
+ */
+public final class LongRange extends NumericRange<Long> implements Iterable<Long>, Iterator<Long> {
+    // attributes
+    //---------------------------------------------------------------
+
+    /**
+     * Left limit.
+     */
+    private final Endpoint<Long> leftEndpoint;
+
+    /**
+     * Right limit.
+     */
+    private final Endpoint<Long> rightEndpoint;
+
+    /**
+     * Increment step.
+     */
+    private final long step;
+
+    /**
+     * Current value.
+     */
+    private long currentValue;
+
+    /**
+     * Calculate default step.
+     */
+    public static final BinaryFunction<Long, Long, Long> DEFAULT_STEP = new BinaryFunction<Long, Long, Long>() {
+
+        public Long evaluate(Long left, Long right) {
+            return left > right ? -1L : 1L;
+        }
+    };
+
+    // constructors
+    // ---------------------------------------------------------------
+    /**
+     * Create a new LongRange.
+     *
+     * @param from start
+     * @param to end
+     */
+    public LongRange(Number from, Number to) {
+        this(from.longValue(), to.longValue());
+    }
+
+    /**
+     * Create a new LongRange.
+     *
+     * @param from start
+     * @param to end
+     * @param step increment
+     */
+    public LongRange(Number from, Number to, Number step) {
+        this(from.longValue(), to.longValue(), step.longValue());
+    }
+
+    /**
+     * Create a new LongRange.
+     *
+     * @param from start
+     * @param to end
+     */
+    public LongRange(long from, long to) {
+        this(from, to, DEFAULT_STEP.evaluate(from, to).longValue());
+    }
+
+    /**
+     * Create a new LongRange.
+     *
+     * @param from start
+     * @param to end
+     * @param step increment
+     */
+    public LongRange(long from, long to, long step) {
+        this(from, DEFAULT_LEFT_BOUND_TYPE, to, DEFAULT_RIGHT_BOUND_TYPE, step);
+    }
+
+    /**
+     * Create a new LongRange.
+     *
+     * @param from start
+     * @param to end
+     */
+    public LongRange(Endpoint<Long> from, Endpoint<Long> to) {
+        this(from.getValue(), from.getBoundType(), to.getValue(), to.getBoundType(),
+                DEFAULT_STEP.evaluate(from.getValue(), to.getValue()));
+    }
+
+    /**
+     * Create a new LongRange.
+     *
+     * @param from start
+     * @param to end
+     * @param step increment
+     */
+    public LongRange(Endpoint<Long> from, Endpoint<Long> to, int step) {
+        this(from.getValue(), from.getBoundType(), to.getValue(), to.getBoundType(), step);
+    }
+
+
+    /**
+     * Create a new LongRange.
+     *
+     * @param from start
+     * @param leftBoundType type of left bound
+     * @param to end
+     * @param rightBoundType type of right bound
+     */
+    public LongRange(long from, BoundType leftBoundType, long to,
+                        BoundType rightBoundType) {
+        this(from, leftBoundType, to, rightBoundType, DEFAULT_STEP.evaluate(from, to));
+    }
+
+    /**
+     * Create a new LongRange.
+     *
+     * @param from start
+     * @param to end
+     * @param step increment
+     */
+    public LongRange(Endpoint<Long> from, Endpoint<Long> to, long step) {
+        this(from.getValue(), from.getBoundType(), to.getValue(), to.getBoundType(), step);
+    }
+
+    /**
+     * Create a new LongRange.
+     *
+     * @param from start
+     * @param leftBoundType type of left bound
+     * @param to end
+     * @param rightBoundType type of right bound
+     * @param step increment
+     */
+    public LongRange(long from, BoundType leftBoundType, long to,
+                     BoundType rightBoundType, long step) {
+        this.leftEndpoint = Validate
+            .notNull(new Endpoint<Long>(from, leftBoundType),
+                     "Left Endpoint argument must not be null");
+        this.rightEndpoint = Validate
+            .notNull(new Endpoint<Long>(to, rightBoundType),
+                     "Right Endpoint argument must not be null");
+        this.step = step;
+        if (from != to && Long.signum(step) != Long.signum(to - from)) {
+            throw new IllegalArgumentException("Will never reach " + to
+                                               + " from " + from
+                                               + " using step " + step);
+        }
+        if (this.leftEndpoint.getBoundType() == BoundType.CLOSED) {
+            this.currentValue = this.leftEndpoint.getValue();
+        } else {
+            this.currentValue = this.leftEndpoint.getValue() + this.step;
+        }
+    }
+
+    // range methods
+    // ---------------------------------------------------------------
+    /**
+     * {@inheritDoc}
+     */
+    public Endpoint<Long> getLeftEndpoint() {
+        return this.leftEndpoint;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Endpoint<Long> getRightEndpoint() {
+        return this.rightEndpoint;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Long getStep() {
+        return this.step;
+    }
+
+    // iterable, iterator methods
+    // ---------------------------------------------------------------
+    /**
+     * {@inheritDoc}
+     */
+    public boolean hasNext() {
+        final long to = this.rightEndpoint.getValue();
+        if (step < 0) {
+            if (this.rightEndpoint.getBoundType() == BoundType.CLOSED) {
+                return this.currentValue >= to;
+            } else {
+                return this.currentValue > to;
+            }
+        } else {
+            if (this.rightEndpoint.getBoundType() == BoundType.CLOSED) {
+                return this.currentValue <= to;
+            } else {
+                return this.currentValue < to;
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Long next() {
+        final long step = this.getStep();
+        final long r = this.currentValue;
+        this.currentValue += step;
+        return r;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void remove() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Iterator<Long> iterator() {
+        return this;
+    }
+
+    // object methods
+    // ---------------------------------------------------------------
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return "LongRange<" + this.leftEndpoint.toLeftString() + ", "
+                + this.rightEndpoint.toRightString() + ", " + step + ">";
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == this) {
+            return true;
+        }
+        if (!(obj instanceof LongRange)) {
+            return false;
+        }
+        LongRange that = (LongRange) obj;
+        return this.leftEndpoint.equals(that.leftEndpoint)
+                && this.rightEndpoint.equals(that.rightEndpoint)
+                && this.step == that.step;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int hashCode() {
+        int hash = "LongRange".hashCode();
+        hash <<= 2;
+        hash ^= this.leftEndpoint.getValue();
+        hash <<= 2;
+        hash ^= this.rightEndpoint.getValue();
+        hash <<= 2;
+        hash ^= this.step;
+        return hash;
+    }
+
+}

Added: commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/NumericRange.java
URL: http://svn.apache.org/viewvc/commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/NumericRange.java?rev=1515264&view=auto
==============================================================================
--- commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/NumericRange.java (added)
+++ commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/NumericRange.java Mon Aug 19 02:51:41 2013
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.functor.range;
+
+import java.util.Collection;
+
+/**
+ * A base class for numeric ranges. The elements within this range must be a
+ * <b>Number</b> and <b>Comparable</b>.
+ *
+ * @param <T> the type of numbers and step that are both a number and comparable
+ * @see org.apache.commons.functor.generator.range.IntegerRange
+ * @see org.apache.commons.functor.generator.range.LongRange
+ * @see org.apache.commons.functor.generator.range.FloatRange
+ * @see org.apache.commons.functor.generator.range.DoubleRange
+ * @see org.apache.commons.functor.generator.range.CharacterRange
+ * @since 0.1
+ * @version $Revision: $ $Date: $
+ */
+public abstract class NumericRange<T extends Number & Comparable<?>> implements Range<T, T> {
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isEmpty() {
+        double leftValue = this.getLeftEndpoint().getValue().doubleValue();
+        double rightValue = this.getRightEndpoint().getValue().doubleValue();
+        boolean closedLeft = this.getLeftEndpoint().getBoundType() == BoundType.CLOSED;
+        boolean closedRight = this.getRightEndpoint().getBoundType() == BoundType.CLOSED;
+        if (!closedLeft && !closedRight
+             && this.getLeftEndpoint().equals(this.getRightEndpoint())) {
+            return Boolean.TRUE;
+        }
+        double step = this.getStep().doubleValue();
+        if (step > 0.0) {
+            double firstValue = closedLeft ? leftValue : leftValue + step;
+            return closedRight ? firstValue > rightValue
+                              : firstValue >= rightValue;
+        } else {
+            double firstValue = closedLeft ? leftValue : leftValue + step;
+            return closedRight ? firstValue < rightValue
+                              : firstValue <= rightValue;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean contains(T obj) {
+        if (obj == null) {
+            return Boolean.FALSE;
+        }
+        double leftValue = this.getLeftEndpoint().getValue().doubleValue();
+        double rightValue = this.getRightEndpoint().getValue().doubleValue();
+        boolean includeLeft = this.getLeftEndpoint().getBoundType() == BoundType.CLOSED;
+        boolean includeRight = this.getRightEndpoint().getBoundType() == BoundType.CLOSED;
+        double step = this.getStep().doubleValue();
+        double value = obj.doubleValue();
+
+        double firstValue = 0;
+        double lastValue = 0;
+
+        if (step < 0.0) {
+            firstValue = includeLeft ? leftValue : leftValue + step;
+            lastValue = includeRight ? rightValue : Math.nextUp(rightValue);
+            if (value > firstValue || value < lastValue) {
+                return Boolean.FALSE;
+            }
+        } else {
+            firstValue = includeLeft ? leftValue : leftValue + step;
+            lastValue = includeRight ? rightValue : rightValue
+                                                    - (rightValue - Math
+                                                        .nextUp(rightValue));
+            if (value < firstValue || value > lastValue) {
+                return Boolean.FALSE;
+            }
+        }
+        return ((value - firstValue) / step + 1) % 1.0 == 0.0;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean containsAll(Collection<T> col) {
+        if (col == null || col.size() == 0) {
+            return Boolean.FALSE;
+        }
+        boolean r = Boolean.TRUE;
+        for (T t : col) {
+            if (!this.contains(t)) {
+                r = Boolean.FALSE;
+                break;
+            }
+        }
+        return r;
+    }
+
+}

Added: commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/Range.java
URL: http://svn.apache.org/viewvc/commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/Range.java?rev=1515264&view=auto
==============================================================================
--- commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/Range.java (added)
+++ commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/Range.java Mon Aug 19 02:51:41 2013
@@ -0,0 +1,93 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.functor.range;
+
+import java.util.Collection;
+
+
+/**
+ * Represent an interval of elements that varies from the <b>left limit</b>
+ * to the <b>right limit</b>. Each limit in this range is an {@link Endpoint
+ * Endpoint}. The left and the right limits can be <b>inclusive</b>
+ * (<b>bounded</b>, <b>closed</b>) or <b>exclusive</b> (<b>unbounded</b>,
+ * <b>open</b>).
+ * <p>
+ * The difference between each element within this range is called <b>step</b>.
+ * The step can be positive or negative, displaying whether the range elements
+ * are ascending or descending.
+ *
+ * @param <T> the type of elements held by this range.
+ * @param <S> the type of the step of this range.
+ * @see org.apache.commons.functor.generator.range.Endpoint
+ * @since 1.0
+ * @version $Revision: $ $Date: $
+ */
+public interface Range<T extends Comparable<?>, S extends Comparable<?>> {
+
+    /**
+     * Default left bound type.
+     */
+    BoundType DEFAULT_LEFT_BOUND_TYPE = BoundType.CLOSED;
+
+    /**
+     * Default right bound type.
+     */
+    BoundType DEFAULT_RIGHT_BOUND_TYPE = BoundType.OPEN;
+
+    /**
+     * Get the left limit of this range.
+     *
+     * @return Endpoint
+     */
+    Endpoint<T> getLeftEndpoint();
+
+    /**
+     * Get the right limit of this range.
+     *
+     * @return Endpoint
+     */
+    Endpoint<T> getRightEndpoint();
+
+    /**
+     * Get the step between elements of this range.
+     *
+     * @return Number
+     */
+    S getStep();
+
+    /**
+     * Returns <code>true</code> if this range is empty.
+     *
+     * @return <code>true</code> if this range is empty
+     */
+    boolean isEmpty();
+
+    /**
+     * Returns <code>true</code> if this range contains the specified element.
+     *
+     * @param obj element whose presence is being tested in this range
+     * @return <code>true</code> if this range contains the specified element
+     */
+    boolean contains(T obj);
+
+    /**
+     * Returns <code>true</code> is this range contains all of the elements in
+     * the specified collection.
+     *
+     * @param col collection to be checked for the containment in this range
+     * @return <code>true</code> if this range contains all of the elements in
+     * the specified collection
+     */
+    boolean containsAll(Collection<T> col);
+}

Added: commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/Ranges.java
URL: http://svn.apache.org/viewvc/commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/Ranges.java?rev=1515264&view=auto
==============================================================================
--- commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/Ranges.java (added)
+++ commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/Ranges.java Mon Aug 19 02:51:41 2013
@@ -0,0 +1,388 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law
+ * or agreed to in writing, software distributed under the License is
+ * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.apache.commons.functor.range;
+
+/**
+ * Range factory.
+ *
+ * @since 1.0
+ * @version $Revision: $ $Date: $
+ */
+public final class Ranges {
+
+    /**
+     * Hidden constructor as this only is a helper class with static methods.
+     */
+    private Ranges() {
+    }
+
+    /**
+     * Create a new IntegerRange.
+     *
+     * @param from start
+     * @param to end
+     * @return IntegerRange
+     */
+    public static IntegerRange integerRange(Number from, Number to) {
+        return new IntegerRange(from, to);
+    }
+
+    /**
+     * Create a new IntegerRange.
+     *
+     * @param from start
+     * @param to end
+     * @param step increment
+     * @return IntegerRange
+     */
+    public static IntegerRange integerRange(Number from, Number to, Number step) {
+        return new IntegerRange(from, to, step);
+    }
+
+    /**
+     * Create a new IntegerRange.
+     *
+     * @param from start
+     * @param to end
+     * @return IntegerRange
+     */
+    public static IntegerRange integerRange(int from, int to) {
+        return new IntegerRange(from, to);
+    }
+
+    /**
+     * Create a new IntegerRange.
+     *
+     * @param from start
+     * @param to end
+     * @param step increment
+     * @return IntegerRange
+     */
+    public static IntegerRange integerRange(int from, int to, int step) {
+        return new IntegerRange(from, to, step);
+    }
+
+    /**
+     * Create a new IntegerRange.
+     *
+     * @param from start
+     * @param leftBoundType type of left bound
+     * @param to end
+     * @param rightBoundType type of right bound
+     * @param step increment
+     * @return IntegerRange
+     */
+    public static IntegerRange integerRange(int from, BoundType leftBoundType,
+                                            int to, BoundType rightBoundType,
+                                            int step) {
+        return new IntegerRange(from, leftBoundType, to, rightBoundType, step);
+    }
+
+    /**
+     * Create a new IntegerRange.
+     *
+     * @param leftEndpoint start
+     * @param rightEndpoint end
+     * @param step increment
+     * @return IntegerRange
+     */
+    public static IntegerRange integerRange(Endpoint<Integer> leftEndpoint,
+                                                Endpoint<Integer> rightEndpoint,
+                                                int step) {
+        return new IntegerRange(leftEndpoint, rightEndpoint, step);
+    }
+
+    /**
+     * Create a new LongRange.
+     *
+     * @param from start
+     * @param to end
+     * @return LongRange
+     */
+    public static LongRange longRange(Number from, Number to) {
+        return new LongRange(from, to);
+    }
+
+    /**
+     * Create a new IntegerRange.
+     *
+     * @param from start
+     * @param to end
+     * @param step increment
+     * @return LongRange
+     */
+    public static LongRange longRange(Number from, Number to, Number step) {
+        return new LongRange(from, to, step);
+    }
+
+    /**
+     * Create a new LongRange.
+     *
+     * @param from start
+     * @param to end
+     * @return LongRange
+     */
+    public static LongRange longRange(long from, long to) {
+        return new LongRange(from, to);
+    }
+
+    /**
+     * Create a new LongRange.
+     *
+     * @param from start
+     * @param to end
+     * @param step increment
+     * @return LongRange
+     */
+    public static LongRange longRange(long from, long to, long step) {
+        return new LongRange(from, to, step);
+    }
+
+    /**
+     * Create a new LongRange.
+     *
+     * @param from start
+     * @param leftBoundType type of left bound
+     * @param to end
+     * @param rightBoundType type of right bound
+     * @param step increment
+     * @return LongRange
+     */
+    public static LongRange longRange(long from, BoundType leftBoundType,
+                                      long to, BoundType rightBoundType,
+                                      long step) {
+        return new LongRange(from, leftBoundType, to, rightBoundType, step);
+    }
+
+    /**
+     * Create a new LongRange.
+     *
+     * @param leftEndpoint start
+     * @param rightEndpoint end
+     * @param step increment
+     * @return LongRange
+     */
+    public static LongRange longRange(Endpoint<Long> leftEndpoint,
+                                                Endpoint<Long> rightEndpoint,
+                                                long step) {
+        return new LongRange(leftEndpoint, rightEndpoint, step);
+    }
+
+    /**
+     * Create a new FloatRange.
+     *
+     * @param from start
+     * @param to end
+     * @return FloatRange
+     */
+    public static FloatRange floatRange(Number from, Number to) {
+        return new FloatRange(from, to);
+    }
+
+    /**
+     * Create a new FloatRange.
+     *
+     * @param from start
+     * @param to end
+     * @param step increment
+     * @return FloatRange
+     */
+    public static FloatRange floatRange(Number from, Number to, Number step) {
+        return new FloatRange(from, to, step);
+    }
+
+    /**
+     * Create a new FloatRange.
+     *
+     * @param from start
+     * @param to end
+     * @return FloatRange
+     */
+    public static FloatRange floatRange(float from, float to) {
+        return new FloatRange(from, to);
+    }
+
+    /**
+     * Create a new FloatRange.
+     *
+     * @param from start
+     * @param to end
+     * @param step increment
+     * @return FloatRange
+     */
+    public static FloatRange floatRange(float from, float to, float step) {
+        return new FloatRange(from, to, step);
+    }
+
+    /**
+     * Create a new FloatRange.
+     *
+     * @param from start
+     * @param leftBoundType type of left bound
+     * @param to end
+     * @param rightBoundType type of right bound
+     * @param step increment
+     * @return FloatRange
+     */
+    public static FloatRange floatRange(float from, BoundType leftBoundType,
+                                        float to, BoundType rightBoundType,
+                                        float step) {
+        return new FloatRange(from, leftBoundType, to, rightBoundType, step);
+    }
+
+    /**
+     * Create a new FloatRange.
+     *
+     * @param leftEndpoint start
+     * @param rightEndpoint end
+     * @param step increment
+     * @return FloatRange
+     */
+    public static FloatRange floatRange(Endpoint<Float> leftEndpoint,
+                                                Endpoint<Float> rightEndpoint,
+                                                float step) {
+        return new FloatRange(leftEndpoint, rightEndpoint, step);
+    }
+
+    /**
+     * Create a new DoubleRange.
+     *
+     * @param from start
+     * @param to end
+     * @return DoubleRange
+     */
+    public static DoubleRange doubleRange(Number from, Number to) {
+        return new DoubleRange(from, to);
+    }
+
+    /**
+     * Create a new DoubleRange.
+     *
+     * @param from start
+     * @param to end
+     * @param step increment
+     * @return DoubleRange
+     */
+    public static DoubleRange doubleRange(Number from, Number to, Number step) {
+        return new DoubleRange(from, to, step);
+    }
+
+    /**
+     * Create a new DoubleRange.
+     *
+     * @param from start
+     * @param to end
+     * @return DoubleRange
+     */
+    public static DoubleRange doubleRange(double from, double to) {
+        return new DoubleRange(from, to);
+    }
+
+    /**
+     * Create a new DoubleRange.
+     *
+     * @param from start
+     * @param to end
+     * @param step increment
+     * @return DoubleRange
+     */
+    public static DoubleRange doubleRange(double from, double to, double step) {
+        return new DoubleRange(from, to, step);
+    }
+
+    /**
+     * Create a new DoubleRange.
+     *
+     * @param from start
+     * @param leftBoundType type of left bound
+     * @param to end
+     * @param rightBoundType type of right bound
+     * @param step increment
+     * @return DoubleRange
+     */
+    public static DoubleRange doubleRange(double from, BoundType leftBoundType,
+                                          double to, BoundType rightBoundType,
+                                          double step) {
+        return new DoubleRange(from, leftBoundType, to, rightBoundType, step);
+    }
+
+    /**
+     * Create a new DoubleRange.
+     *
+     * @param leftEndpoint start
+     * @param rightEndpoint end
+     * @param step increment
+     * @return DoubleRange
+     */
+    public static DoubleRange doubleRange(Endpoint<Double> leftEndpoint,
+                                                Endpoint<Double> rightEndpoint,
+                                                double step) {
+        return new DoubleRange(leftEndpoint, rightEndpoint, step);
+    }
+
+    /**
+     * Create a new CharacterRange.
+     *
+     * @param from start
+     * @param to end
+     * @return CharacterRange
+     */
+    public static CharacterRange characterRange(char from, char to) {
+        return new CharacterRange(from, to);
+    }
+
+    /**
+     * Create a new CharacterRange.
+     *
+     * @param from start
+     * @param to end
+     * @param step increment
+     * @return CharacterRange
+     */
+    public static CharacterRange characterRange(char from, char to, int step) {
+        return new CharacterRange(from, to, step);
+    }
+
+    /**
+     * Create a new CharacterRange.
+     *
+     * @param from start
+     * @param leftBoundType type of left bound
+     * @param to end
+     * @param rightBoundType type of right bound
+     * @param step increment
+     * @return CharacterRange
+     */
+    public static CharacterRange characterRange(char from,
+                                                BoundType leftBoundType,
+                                                char to,
+                                                BoundType rightBoundType,
+                                                int step) {
+        return new CharacterRange(from, leftBoundType, to, rightBoundType, step);
+    }
+
+    /**
+     * Create a new CharacterRange.
+     *
+     * @param leftEndpoint start
+     * @param rightEndpoint end
+     * @param step increment
+     * @return CharacterRange
+     */
+    public static CharacterRange characterRange(Endpoint<Character> leftEndpoint,
+                                                Endpoint<Character> rightEndpoint,
+                                                int step) {
+        return new CharacterRange(leftEndpoint, rightEndpoint, step);
+    }
+}

Added: commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/package-info.java
URL: http://svn.apache.org/viewvc/commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/package-info.java?rev=1515264&view=auto
==============================================================================
--- commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/package-info.java (added)
+++ commons/proper/functor/branches/generators-FUNCTOR-14/src/main/java/org/apache/commons/functor/range/package-info.java Mon Aug 19 02:51:41 2013
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * <p>
+ * Contains code related to Ranges.
+ * </p>
+ */
+package org.apache.commons.functor.range;

Modified: commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/TestAlgorithms.java
URL: http://svn.apache.org/viewvc/commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/TestAlgorithms.java?rev=1515264&r1=1515263&r2=1515264&view=diff
==============================================================================
--- commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/TestAlgorithms.java (original)
+++ commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/TestAlgorithms.java Mon Aug 19 02:51:41 2013
@@ -34,7 +34,7 @@ import org.apache.commons.functor.genera
 import org.apache.commons.functor.generator.loop.IteratorToGeneratorAdapter;
 import org.apache.commons.functor.generator.loop.LoopGenerator;
 import org.apache.commons.functor.generator.loop.TransformedGenerator;
-import org.apache.commons.functor.generator.range.IntegerRange;
+import org.apache.commons.functor.range.IntegerRange;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -116,7 +116,7 @@ public class TestAlgorithms {
 
     @Test
     public void testApplyToGenerator() {
-        LoopGenerator<Integer> gen = new IntegerRange(1,5);
+        LoopGenerator<Integer> gen = IteratorToGeneratorAdapter.adapt(new IntegerRange(1,5));
         Summer summer = new Summer();
 
         new TransformedGenerator<Integer, Integer>(gen, new Doubler()).run(summer);

Modified: commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/example/kata/two/TestBinaryChop.java
URL: http://svn.apache.org/viewvc/commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/example/kata/two/TestBinaryChop.java?rev=1515264&r1=1515263&r2=1515264&view=diff
==============================================================================
--- commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/example/kata/two/TestBinaryChop.java (original)
+++ commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/example/kata/two/TestBinaryChop.java Mon Aug 19 02:51:41 2013
@@ -26,7 +26,8 @@ import org.apache.commons.functor.Predic
 import org.apache.commons.functor.Procedure;
 import org.apache.commons.functor.core.algorithm.RecursiveEvaluation;
 import org.apache.commons.functor.core.algorithm.UntilDo;
-import org.apache.commons.functor.generator.range.IntegerRange;
+import org.apache.commons.functor.generator.loop.IteratorToGeneratorAdapter;
+import org.apache.commons.functor.range.IntegerRange;
 import org.junit.Test;
 
 /**
@@ -102,7 +103,7 @@ public class TestBinaryChop {
         assertEquals(-1, chopper.find(6, new int[] { 1, 3, 5, 7 }));
         assertEquals(-1, chopper.find(8, new int[] { 1, 3, 5, 7 }));
 
-        List<Integer> largeList = (List<Integer>) (new IntegerRange(0, 100001).toCollection());
+        List<Integer> largeList = (List<Integer>) (IteratorToGeneratorAdapter.adapt(new IntegerRange(0, 100001)).toCollection());
         assertEquals(-1, chopper.find(new Integer(-5), largeList));
         assertEquals(100000, chopper.find(new Integer(100000), largeList));
         assertEquals(0, chopper.find(new Integer(0), largeList));

Modified: commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/generator/TestFilteredGenerator.java
URL: http://svn.apache.org/viewvc/commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/generator/TestFilteredGenerator.java?rev=1515264&r1=1515263&r2=1515264&view=diff
==============================================================================
--- commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/generator/TestFilteredGenerator.java (original)
+++ commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/generator/TestFilteredGenerator.java Mon Aug 19 02:51:41 2013
@@ -25,7 +25,8 @@ import java.util.List;
 
 import org.apache.commons.functor.UnaryPredicate;
 import org.apache.commons.functor.UnaryProcedure;
-import org.apache.commons.functor.generator.range.IntegerRange;
+import org.apache.commons.functor.generator.loop.IteratorToGeneratorAdapter;
+import org.apache.commons.functor.range.IntegerRange;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -39,7 +40,7 @@ public class TestFilteredGenerator
 
     @Before
     public void setUp() throws Exception {
-        wrappedGenerator = new IntegerRange(1, 10);
+        wrappedGenerator = IteratorToGeneratorAdapter.adapt(new IntegerRange(1, 10));
         filteredGenerator = new FilteredGenerator<Integer>(wrappedGenerator, isEven);
     }
 
@@ -70,13 +71,14 @@ public class TestFilteredGenerator
 
     @Test
     public void testEquals() {
-        Generator<Integer> anotherGenerate = new FilteredGenerator<Integer>(new IntegerRange(1, 10), isEven);
+        Generator<Integer> anotherGenerate = new FilteredGenerator<Integer>(
+                IteratorToGeneratorAdapter.adapt(new IntegerRange(1, 10)), isEven);
         assertEquals(filteredGenerator, filteredGenerator);
         assertEquals(filteredGenerator, anotherGenerate);
         assertTrue(!filteredGenerator.equals((FilteredGenerator<Integer>)null));
 
 		Generator<Integer> aGenerateWithADifferentPredicate = new FilteredGenerator<Integer>(
-			new IntegerRange(1, 10), new UnaryPredicate<Integer>() {
+	        IteratorToGeneratorAdapter.adapt(new IntegerRange(1, 10)), new UnaryPredicate<Integer>() {
 				public boolean test(Integer obj) {
 					return obj % 2 == 0;
 				}
@@ -84,7 +86,8 @@ public class TestFilteredGenerator
 
         assertTrue(!filteredGenerator.equals(aGenerateWithADifferentPredicate));
 
-        Generator<Integer> aGenerateWithADifferentWrapped = new FilteredGenerator<Integer>(new IntegerRange(1,11), isEven);
+        Generator<Integer> aGenerateWithADifferentWrapped = new FilteredGenerator<Integer>(
+                IteratorToGeneratorAdapter.adapt(new IntegerRange(1,11)), isEven);
         assertTrue(!filteredGenerator.equals(aGenerateWithADifferentWrapped));
     }
 

Modified: commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/generator/loop/TestGenerateUntil.java
URL: http://svn.apache.org/viewvc/commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/generator/loop/TestGenerateUntil.java?rev=1515264&r1=1515263&r2=1515264&view=diff
==============================================================================
--- commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/generator/loop/TestGenerateUntil.java (original)
+++ commons/proper/functor/branches/generators-FUNCTOR-14/src/test/java/org/apache/commons/functor/generator/loop/TestGenerateUntil.java Mon Aug 19 02:51:41 2013
@@ -21,7 +21,7 @@ import static org.junit.Assert.assertTru
 
 import org.apache.commons.functor.UnaryPredicate;
 import org.apache.commons.functor.generator.Generator;
-import org.apache.commons.functor.generator.range.IntegerRange;
+import org.apache.commons.functor.range.IntegerRange;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -35,7 +35,7 @@ public class TestGenerateUntil
 
     @Before
     public void setUp() throws Exception {
-        wrappedGenerator = new IntegerRange(1, 10);
+        wrappedGenerator = IteratorToGeneratorAdapter.adapt(new IntegerRange(1, 10));
         generateUntil = new GenerateUntil<Integer>(wrappedGenerator, isMoreThanFive);
     }
 
@@ -66,13 +66,14 @@ public class TestGenerateUntil
 
     @Test
     public void testEquals() {
-        Generator<Integer> anotherGenerate = new GenerateUntil<Integer>(new IntegerRange(1, 10), isMoreThanFive);
+        Generator<Integer> anotherGenerate = new GenerateUntil<Integer>(
+            IteratorToGeneratorAdapter.adapt(new IntegerRange(1, 10)), isMoreThanFive);
         assertEquals(generateUntil, generateUntil);
         assertEquals(generateUntil, anotherGenerate);
         assertTrue(!generateUntil.equals((GenerateUntil<Integer>)null));
 
 		Generator<Integer> aGenerateWithADifferentPredicate = new GenerateUntil<Integer>(
-				new IntegerRange(1, 10),
+		        IteratorToGeneratorAdapter.adapt(new IntegerRange(1, 10)),
 				new UnaryPredicate<Integer>() {
 				public boolean test(Integer obj) {
 					return obj > FIVE;
@@ -80,7 +81,8 @@ public class TestGenerateUntil
 			});
         assertTrue(!generateUntil.equals(aGenerateWithADifferentPredicate));
 
-        Generator<Integer> aGenerateWithADifferentWrapped = new GenerateUntil<Integer>(new IntegerRange(1,2), isMoreThanFive);
+        Generator<Integer> aGenerateWithADifferentWrapped = new GenerateUntil<Integer>(
+            IteratorToGeneratorAdapter.adapt(new IntegerRange(1,2)), isMoreThanFive);
         assertTrue(!generateUntil.equals(aGenerateWithADifferentWrapped));
     }