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 2011/05/22 21:09:03 UTC

svn commit: r1126168 - in /tapestry/tapestry5/trunk/tapestry-func/src: main/java/org/apache/tapestry5/func/F.java test/java/org/apache/tapestry5/func/FuncTest.java

Author: hlship
Date: Sun May 22 19:09:03 2011
New Revision: 1126168

URL: http://svn.apache.org/viewvc?rev=1126168&view=rev
Log:
TAP5-1390: Add ability to create lazy flow from an initial value and a mapper to map to each successive value

Modified:
    tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/F.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/F.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/F.java?rev=1126168&r1=1126167&r2=1126168&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 Sun May 22 19:09:03 2011
@@ -385,6 +385,44 @@ public class F
         return new LazyFlow<T>(function);
     }
 
+    private static <T> LazyFunction<T> toLazyFunction(final T currentValue, final Mapper<T, T> function)
+    {
+        return new LazyFunction<T>()
+        {
+            public LazyContinuation<T> next()
+            {
+                final T nextValue = function.map(currentValue);
+
+                return new LazyContinuation<T>(nextValue, toLazyFunction(nextValue, function));
+            }
+        };
+    }
+
+    /**
+     * Creates an infinite lazy flow from an initial value and a function to map from the current value to the
+     * next value.
+     * 
+     * @since 5.3.0
+     * @param <T>
+     * @param initial
+     *            initial value in flow
+     * @param function
+     *            maps from current value in flow to next value in flow
+     * @return lazy flow
+     */
+    public static <T> Flow<T> lazy(final T initial, final Mapper<T, T> function)
+    {
+        LazyFunction<T> head = new LazyFunction<T>()
+        {
+            public LazyContinuation<T> next()
+            {
+                return new LazyContinuation<T>(initial, toLazyFunction(initial, function));
+            }
+        };
+
+        return lazy(head);
+    }
+
     /**
      * Creates an <em>infinite</em> series of numbers.
      * <p>

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=1126168&r1=1126167&r2=1126168&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 Sun May 22 19:09:03 2011
@@ -603,4 +603,21 @@ public class FuncTest extends BaseFuncTe
 
         assertFlowValues(flow, 9, 7, 1);
     }
+
+    @Test
+    public void lazy_flow_from_mapper()
+    {
+        Mapper<Integer, Integer> mapper = new Mapper<Integer, Integer>()
+        {
+            public Integer map(Integer element)
+            {
+
+                return 2 * element.intValue();
+            }
+        };
+
+        Flow<Integer> flow = F.lazy(3, mapper);
+
+        assertFlowValues(flow.take(5), 3, 6, 12, 24, 48);
+    }
 }