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


Reply via email to