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);
+    }
+
 }