You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2010/06/02 18:17:23 UTC
svn commit: r950620 - in /tapestry/tapestry5/trunk/tapestry-func/src:
main/java/org/apache/tapestry5/func/ test/java/org/apache/tapestry5/func/
Author: hlship
Date: Wed Jun 2 16:17:23 2010
New Revision: 950620
URL: http://svn.apache.org/viewvc?rev=950620&view=rev
Log:
Add a non-lazy count() operation to the Flow interface
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/FilteredFlow.java
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/Flow.java
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/MappedFlow.java
tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/FuncTest.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=950620&r1=950619&r2=950620&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 Wed Jun 2 16:17:23 2010
@@ -192,4 +192,10 @@ abstract class AbstractFlow<T> implement
return Collections.unmodifiableList(toMutableList());
}
+
+ public int count()
+ {
+ return isEmpty() ? 0 : 1 + rest().count();
+ }
+
}
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=950620&r1=950619&r2=950620&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 Wed Jun 2 16:17:23 2010
@@ -172,4 +172,10 @@ class ArrayFlow<T> extends AbstractFlow<
return new ArrayFlow<T>(values, start + 1, count - 1);
}
+
+ public int count()
+ {
+ return count;
+ }
+
}
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=950620&r1=950619&r2=950620&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 Wed Jun 2 16:17:23 2010
@@ -106,4 +106,9 @@ class EmptyFlow<T> extends AbstractFlow<
return F.emptyFlow();
}
+ public int count()
+ {
+ return 0;
+ }
+
}
Modified: tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/FilteredFlow.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/FilteredFlow.java?rev=950620&r1=950619&r2=950620&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/FilteredFlow.java (original)
+++ tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/FilteredFlow.java Wed Jun 2 16:17:23 2010
@@ -82,7 +82,7 @@ class FilteredFlow<T> extends AbstractFl
if (cursor.isEmpty())
{
empty = true;
- rest = cursor;
+ rest = F.emptyFlow();
break;
}
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=950620&r1=950619&r2=950620&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 Wed Jun 2 16:17:23 2010
@@ -116,4 +116,10 @@ public interface Flow<T> extends Iterabl
* or is empty, this will return an empty Flow.
*/
Flow<T> rest();
+
+ /**
+ * Returns the number of values in the Flow. This forces the realization of much of the Flow (i.e., because
+ * each value will need to be passed through any {@link Predicate}s).
+ */
+ int count();
}
Modified: tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/MappedFlow.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/MappedFlow.java?rev=950620&r1=950619&r2=950620&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/MappedFlow.java (original)
+++ tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/MappedFlow.java Wed Jun 2 16:17:23 2010
@@ -87,4 +87,15 @@ class MappedFlow<T, X> extends AbstractF
resolved = true;
}
+
+ public synchronized int count()
+ {
+ if (resolved) {
+ return empty ? 0 : 1 + rest.count(); }
+
+ // Not yet resolved, so mappedFlow is still valid. Mapping never changes the count, thus:
+
+ return mappedFlow.count();
+ }
+
}
Modified: tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/FuncTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/FuncTest.java?rev=950620&r1=950619&r2=950620&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/FuncTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/FuncTest.java Wed Jun 2 16:17:23 2010
@@ -627,4 +627,47 @@ public class FuncTest extends Assert
assertListsEquals(flow.mapcat(sequencer).toList(), 3, 3, 3, 1, 2, 2);
}
+
+ @Test
+ public void count_of_the_empty_flow_is_zero()
+ {
+ assertEquals(F.flow().count(), 0);
+ }
+
+ @Test
+ public void count_of_array_flow()
+ {
+ assertEquals(F.flow(1, 2, 3).count(), 3);
+ }
+
+ @Test
+ public void count_of_a_mapped_flow_before_and_after_realization()
+ {
+ Flow<Integer> flow = F.flow("Mary", "had", "a", "little", "lamb").map(stringToLength);
+
+ assertEquals(flow.count(), 5);
+
+ assertEquals(flow.first(), (Integer) 4);
+
+ assertEquals(flow.count(), 5);
+ }
+
+ @Test
+ public void count_of_a_filtered_flow()
+ {
+ Flow<String> flow = F.flow("Mary", "had", "a", "little", "lamb");
+
+ assertEquals(flow.filter(F.isNull()).count(), 0);
+ assertEquals(flow.filter(F.notNull()).count(), 5);
+ }
+
+ @Test
+ public void count_of_a_mapped_filtered_empty_flow()
+ {
+ Flow<Integer> flow = F.flow("Mary", "had", "etc.").filter(F.isNull()).map(stringToLength);
+
+ assertTrue(flow.isEmpty());
+ assertEquals(flow.count(), 0);
+ }
+
}