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


Reply via email to