You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2010/06/04 01:29:49 UTC

svn commit: r951204 - in /tapestry/tapestry5/trunk/tapestry-func/src: main/java/org/apache/tapestry5/func/ test/java/org/apache/tapestry5/func/

Author: hlship
Date: Thu Jun  3 23:29:49 2010
New Revision: 951204

URL: http://svn.apache.org/viewvc?rev=951204&view=rev
Log:
Work on other LazyFunctions that would inadventently evalute first() prematurely

Added:
    tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyFirst.java
      - copied, changed from r951199, tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyWalk.java
Modified:
    tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyConcat.java
    tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyTake.java
    tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyWalk.java
    tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/MapperTest.java

Modified: tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyConcat.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyConcat.java?rev=951204&r1=951203&r2=951204&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyConcat.java (original)
+++ tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyConcat.java Thu Jun  3 23:29:49 2010
@@ -17,25 +17,25 @@ package org.apache.tapestry5.func;
 @SuppressWarnings("unchecked")
 class LazyConcat<T> implements LazyFunction<T>
 {
-    private final Flow<T> first, second;
+    private final Flow<T> left, right;
 
     public LazyConcat(Flow<T> first, Flow<? extends T> second)
     {
-        this.first = first;
-        this.second = (Flow<T>) second;
+        this.left = first;
+        this.right = (Flow<T>) second;
     }
 
     public LazyContinuation<T> next()
     {
-        if (first.isEmpty())
+        if (left.isEmpty())
         {
-            if (second.isEmpty())
+            if (right.isEmpty())
                 return null;
 
-            return new LazyContinuation<T>(second.first(), new LazyWalk<T>(second.rest()));
+            return new LazyContinuation<T>(new LazyFirst<T>(right), new LazyWalk<T>(right.rest()));
         }
 
-        return new LazyContinuation<T>(first.first(), new LazyConcat<T>(first.rest(), second));
+        return new LazyContinuation<T>(new LazyFirst<T>(left), new LazyConcat<T>(left.rest(), right));
     }
 
 }

Copied: tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyFirst.java (from r951199, tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyWalk.java)
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyFirst.java?p2=tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyFirst.java&p1=tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyWalk.java&r1=951199&r2=951204&rev=951204&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyWalk.java (original)
+++ tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyFirst.java Thu Jun  3 23:29:49 2010
@@ -14,23 +14,18 @@
 
 package org.apache.tapestry5.func;
 
-/**
- * Used by {@link LazyConcat} to walk down the values of the second flow.
- */
-class LazyWalk<T> implements LazyFunction<T>
+class LazyFirst<T> implements LazyValue<T>
 {
     private final Flow<T> flow;
 
-    public LazyWalk(Flow<T> flow)
+    public LazyFirst(Flow<T> flow)
     {
         this.flow = flow;
     }
 
-    public LazyContinuation<T> next()
+    public T get()
     {
-        if (flow.isEmpty())
-            return null;
-
-        return new LazyContinuation<T>(flow.first(), new LazyWalk<T>(flow.rest()));
+        return flow.first();
     }
+
 }

Modified: tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyTake.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyTake.java?rev=951204&r1=951203&r2=951204&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyTake.java (original)
+++ tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyTake.java Thu Jun  3 23:29:49 2010
@@ -31,7 +31,7 @@ class LazyTake<T> implements LazyFunctio
         if (flow.isEmpty() || length < 1)
             return null;
 
-        return new LazyContinuation<T>(flow.first(), new LazyTake<T>(length - 1, flow.rest()));
+        return new LazyContinuation<T>(new LazyFirst<T>(flow), new LazyTake<T>(length - 1, flow.rest()));
     }
 
 }

Modified: tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyWalk.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyWalk.java?rev=951204&r1=951203&r2=951204&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyWalk.java (original)
+++ tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyWalk.java Thu Jun  3 23:29:49 2010
@@ -31,6 +31,6 @@ class LazyWalk<T> implements LazyFunctio
         if (flow.isEmpty())
             return null;
 
-        return new LazyContinuation<T>(flow.first(), new LazyWalk<T>(flow.rest()));
+        return new LazyContinuation<T>(new LazyFirst<T>(flow), new LazyWalk<T>(flow.rest()));
     }
 }

Modified: tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/MapperTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/MapperTest.java?rev=951204&r1=951203&r2=951204&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/MapperTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/MapperTest.java Thu Jun  3 23:29:49 2010
@@ -125,8 +125,27 @@ public class MapperTest extends BaseFunc
 
         // Because of laziness, its possible to count all the values in some mapped lists, without
         // ever actually running the mapper to determine the final value.
-        
+
         assertEquals(F.range(1, 100).map(doubler).count(), 99);
         assertEquals(count.get(), 0);
+
+        // Because values are now lazily evaluated as well as flows, we can count the size of a flow
+        // without ever actually calculating (via the mapper) an output value.
+
+        Flow<Integer> flow = F.range(1, 100).map(doubler).concat(F.range(1, 10).map(doubler));
+        assertEquals(flow.count(), 108);
+        assertEquals(count.get(), 0);
+
+        assertFlowValues(flow.take(2), 2, 4);
+        assertEquals(count.get(), 2);
+
+        count.set(0);
+
+        // Isn't this nifty; take-ing from a flow will create a flow that references parts
+        // of the original flow, and previously computed values (2 and 4) are still accessible!
+
+        assertFlowValues(flow.take(3), 2, 4, 6);
+        assertEquals(count.get(), 1);
+
     }
 }