Author: hlship
Date: Thu Jun 3 06:44:09 2010
New Revision: 950889
URL: http://svn.apache.org/viewvc?rev=950889&view=rev
Log:
Add a lazy take() method to Flow, and add a method for creating an infinite
series to F
Added:
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazySeries.java
- copied, changed from r950888,
tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/RangeTests.java
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyTake.java
- copied, changed from r950888,
tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/RangeTests.java
tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/TakeTests.java
- copied, changed from r950888,
tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/RangeTests.java
Modified:
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/AbstractFlow.java
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/ArrayFlow.java
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/EmptyFlow.java
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/F.java
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/Flow.java
tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/RangeTests.java
Modified:
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/AbstractFlow.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/AbstractFlow.java?rev=950889&r1=950888&r2=950889&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/AbstractFlow.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/AbstractFlow.java
Thu Jun 3 06:44:09 2010
@@ -196,4 +196,9 @@ abstract class AbstractFlow<T> implement
return isEmpty() ? 0 : 1 + rest().count();
}
+ public Flow<T> take(int length)
+ {
+ return F.lazy(new LazyTake<T>(length, this));
+ }
+
}
Modified:
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/ArrayFlow.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/ArrayFlow.java?rev=950889&r1=950888&r2=950889&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/ArrayFlow.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/ArrayFlow.java
Thu Jun 3 06:44:09 2010
@@ -178,4 +178,12 @@ class ArrayFlow<T> extends AbstractFlow<
return count;
}
+ public Flow<T> take(int length)
+ {
+ if (length < 1)
+ return F.emptyFlow();
+
+ return new ArrayFlow<T>(values, start, Math.min(count, length));
+ }
+
}
Modified:
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/EmptyFlow.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/EmptyFlow.java?rev=950889&r1=950888&r2=950889&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/EmptyFlow.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/EmptyFlow.java
Thu Jun 3 06:44:09 2010
@@ -111,4 +111,8 @@ class EmptyFlow<T> extends AbstractFlow<
return 0;
}
+ public Flow<T> take(int length)
+ {
+ return this;
+ }
}
Modified:
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/F.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/F.java?rev=950889&r1=950888&r2=950889&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/F.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/F.java
Thu Jun 3 06:44:09 2010
@@ -261,4 +261,14 @@ public class F
return new LazyFlow<T>(function);
}
+
+ /**
+ * Creates an <em>infinite</em> series of numbers.
+ * <p>
+ * Attempting to get the {...@linkplain Flow#count()} of the series will
form an infinite loop.
+ */
+ public static Flow<Integer> series(int start, int delta)
+ {
+ return lazy(new LazySeries(start, delta));
+ }
}
Modified:
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/Flow.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/Flow.java?rev=950889&r1=950888&r2=950889&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/Flow.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/Flow.java
Thu Jun 3 06:44:09 2010
@@ -122,4 +122,13 @@ public interface Flow<T> extends Iterabl
* each value will need to be passed through any {...@link Predicate}s).
*/
int count();
+
+ /**
+ * Returns a new Flow containing just the first values from
+ * this Flow.
+ *
+ * @param length
+ * maximum number of values in the Flow
+ */
+ Flow<T> take(int length);
}
Copied:
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazySeries.java
(from r950888,
tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/RangeTests.java)
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazySeries.java?p2=tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazySeries.java&p1=tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/RangeTests.java&r1=950888&r2=950889&rev=950889&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/RangeTests.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazySeries.java
Thu Jun 3 06:44:09 2010
@@ -14,26 +14,19 @@
package org.apache.tapestry5.func;
-import org.testng.annotations.Test;
-
-public class RangeTests extends FuncAssert
+class LazySeries implements LazyFunction<Integer>
{
- @Test
- public void empty_range_if_values_equal()
- {
- assertTrue(F.range(9, 9).isEmpty());
- }
+ private final int current, delta;
- @Test
- public void ascending_range()
+ public LazySeries(int current, int delta)
{
-
- assertFlowValues(F.range(5, 8), 5, 6, 7);
+ this.current = current;
+ this.delta = delta;
}
- @Test
- public void descending_range()
+ public LazyContinuation<Integer> next()
{
- assertFlowValues(F.range(8, 5), 8, 7, 6);
+ return new LazyContinuation<Integer>(current, new LazySeries(current +
delta, delta));
}
+
}
Copied:
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyTake.java
(from r950888,
tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/RangeTests.java)
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyTake.java?p2=tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyTake.java&p1=tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/RangeTests.java&r1=950888&r2=950889&rev=950889&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/RangeTests.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyTake.java
Thu Jun 3 06:44:09 2010
@@ -14,26 +14,24 @@
package org.apache.tapestry5.func;
-import org.testng.annotations.Test;
-
-public class RangeTests extends FuncAssert
+class LazyTake<T> implements LazyFunction<T>
{
- @Test
- public void empty_range_if_values_equal()
+ private final int length;
+
+ private final Flow<T> flow;
+
+ public LazyTake(int length, Flow<T> flow)
{
- assertTrue(F.range(9, 9).isEmpty());
+ this.length = length;
+ this.flow = flow;
}
- @Test
- public void ascending_range()
+ public LazyContinuation<T> next()
{
+ if (flow.isEmpty() || length < 1)
+ return null;
- assertFlowValues(F.range(5, 8), 5, 6, 7);
+ return new LazyContinuation<T>(flow.first(), new LazyTake<T>(length -
1, flow.rest()));
}
- @Test
- public void descending_range()
- {
- assertFlowValues(F.range(8, 5), 8, 7, 6);
- }
}
Modified:
tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/RangeTests.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/RangeTests.java?rev=950889&r1=950888&r2=950889&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/RangeTests.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/RangeTests.java
Thu Jun 3 06:44:09 2010
@@ -36,4 +36,12 @@ public class RangeTests extends FuncAsse
{
assertFlowValues(F.range(8, 5), 8, 7, 6);
}
+
+ @Test
+ public void series()
+ {
+ Flow<Integer> series = F.series(3, 5);
+
+ assertFlowValues(series.take(5), 3, 8, 13, 18, 23);
+ }
}
Copied:
tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/TakeTests.java
(from r950888,
tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/RangeTests.java)
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/TakeTests.java?p2=tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/TakeTests.java&p1=tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/RangeTests.java&r1=950888&r2=950889&rev=950889&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/RangeTests.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/TakeTests.java
Thu Jun 3 06:44:09 2010
@@ -16,24 +16,38 @@ package org.apache.tapestry5.func;
import org.testng.annotations.Test;
-public class RangeTests extends FuncAssert
+public class TakeTests extends FuncAssert
{
@Test
- public void empty_range_if_values_equal()
+ public void take_from_empty_list()
{
- assertTrue(F.range(9, 9).isEmpty());
+ assertSame(F.flow().take(34), F.EMPTY_FLOW);
}
@Test
- public void ascending_range()
+ public void take_from_flow()
{
+ Predicate<Integer> evenp = new Predicate<Integer>()
+ {
- assertFlowValues(F.range(5, 8), 5, 6, 7);
+ public boolean accept(Integer object)
+ {
+ return object % 2 == 0;
+ }
+ };
+
+ assertFlowValues(F.series(1, 1).remove(evenp).take(2), 1, 3);
}
@Test
- public void descending_range()
+ public void take_from_array_flow()
{
- assertFlowValues(F.range(8, 5), 8, 7, 6);
+ Flow<Integer> flow = F.flow(1, 2, 3, 4, 5);
+
+ assertFlowValues(flow.take(2), 1, 2);
+
+ assertFlowValues(flow.take(99), 1, 2, 3, 4, 5);
+
+ assertSame(flow.take(0), F.EMPTY_FLOW);
}
}