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/05/28 03:20:40 UTC

svn commit: r949059 - in /tapestry/tapestry5/trunk/tapestry-ioc/src: main/java/org/apache/tapestry5/func/Flow.java main/java/org/apache/tapestry5/func/FlowImpl.java test/java/org/apache/tapestry5/func/FuncTest.java

Author: hlship
Date: Fri May 28 01:20:40 2010
New Revision: 949059

URL: http://svn.apache.org/viewvc?rev=949059&view=rev
Log:
Add sorting capability to Flows

Modified:
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/func/Flow.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/func/FlowImpl.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/func/FuncTest.java

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/func/Flow.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/func/Flow.java?rev=949059&r1=949058&r2=949059&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/func/Flow.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/func/Flow.java Fri May 28 01:20:40 2010
@@ -14,6 +14,7 @@
 
 package org.apache.tapestry5.func;
 
+import java.util.Comparator;
 import java.util.List;
 
 /**
@@ -66,5 +67,16 @@ public interface Flow<T>
     /** Returns a new Flow with the values in the list appended to this Flow. */
     Flow<T> concat(List<? extends T> list);
 
+    /** Appends any number of type compatible values to the end of this Flow. */
     <V extends T> Flow<T> append(V... values);
+
+    /**
+     * Sorts this Flow forming a new Flow.
+     * 
+     * @throws ClassCastException
+     *             if type <T> does not extend {@link Comparable}
+     */
+    Flow<T> sort();
+
+    Flow<T> sort(Comparator<? super T> comparator);
 }

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/func/FlowImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/func/FlowImpl.java?rev=949059&r1=949058&r2=949059&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/func/FlowImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/func/FlowImpl.java Fri May 28 01:20:40 2010
@@ -17,6 +17,7 @@ package org.apache.tapestry5.func;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 
 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
@@ -50,6 +51,9 @@ class FlowImpl<T> implements Flow<T>
     {
         Defense.notNull(predicate, "predicate");
 
+        if (isEmpty())
+            return this;
+
         List<T> result = new ArrayList<T>(values.size());
 
         for (T item : values)
@@ -135,12 +139,17 @@ class FlowImpl<T> implements Flow<T>
         if (other.isEmpty())
             return this;
 
-        List<T> newValues = new ArrayList<T>(values);
+        List<T> newValues = copy();
         newValues.addAll(other.toList());
 
         return new FlowImpl<T>(newValues);
     }
 
+    private List<T> copy()
+    {
+        return new ArrayList<T>(values);
+    }
+
     public Flow<T> concat(List<? extends T> list)
     {
         return concat(F.flow(list));
@@ -151,4 +160,31 @@ class FlowImpl<T> implements Flow<T>
         return concat(F.flow(values));
     }
 
+    @SuppressWarnings("unchecked")
+    public Flow<T> sort()
+    {
+        if (values.size() < 2)
+            return this;
+
+        List<Comparable> newValues = (List<Comparable>) copy();
+
+        Collections.sort(newValues);
+
+        return new FlowImpl<T>((List<T>) newValues);
+    }
+
+    public Flow<T> sort(Comparator<? super T> comparator)
+    {
+        Defense.notNull(comparator, "comparator");
+
+        if (values.size() < 2)
+            return this;
+
+        List<T> newValues = copy();
+
+        Collections.sort(newValues, comparator);
+
+        return new FlowImpl<T>(newValues);
+    }
+
 }

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/func/FuncTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/func/FuncTest.java?rev=949059&r1=949058&r2=949059&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/func/FuncTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/func/FuncTest.java Fri May 28 01:20:40 2010
@@ -16,13 +16,15 @@ package org.apache.tapestry5.func;
 
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
+import java.util.Locale;
 
 import org.apache.tapestry5.ioc.internal.util.Defense;
-import org.apache.tapestry5.ioc.test.TestBase;
+import org.apache.tapestry5.ioc.test.TestUtils;
 import org.testng.annotations.Test;
 
-public class FuncTest extends TestBase
+public class FuncTest extends TestUtils
 {
     private Mapper<String, Integer> stringToLength = new Mapper<String, Integer>()
     {
@@ -212,6 +214,14 @@ public class FuncTest extends TestBase
     }
 
     @Test
+    public void filter_empty_list_is_same()
+    {
+        Flow<Integer> flow = F.flow();
+
+        assertSame(flow.filter(evenp), flow);
+    }
+
+    @Test
     public void combine_predicate_with_and()
     {
         List<Integer> input = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
@@ -330,4 +340,56 @@ public class FuncTest extends TestBase
 
         assertListsEquals(updated.toList(), 1, 2, 3, 4, 5, 6);
     }
+
+    @Test
+    public void sort_comparable_list()
+    {
+        assertListsEquals(F.flow("fred", "barney", "wilma", "betty").sort().toList(), "barney", "betty", "fred",
+                "wilma");
+    }
+
+    @Test
+    public void sort_a_short_list_returns_same()
+    {
+        Flow<String> zero = F.flow();
+
+        Comparator<String> comparator = new Comparator<String>()
+        {
+            public int compare(String o1, String o2)
+            {
+                return o1.length() - o2.length();
+            }
+        };
+
+        assertSame(zero.sort(), zero);
+        assertSame(zero.sort(comparator), zero);
+
+        Flow<String> one = F.flow("Hello");
+
+        assertSame(one.sort(), one);
+        assertSame(one.sort(comparator), one);
+    }
+
+    @Test
+    public void sort_using_explicit_comparator()
+    {
+        Flow<String> flow = F.flow("a", "eeeee", "ccc", "bb", "dddd");
+        Comparator<String> comparator = new Comparator<String>()
+        {
+            public int compare(String o1, String o2)
+            {
+                return o1.length() - o2.length();
+            }
+        };
+
+        assertListsEquals(flow.sort(comparator).toList(), "a", "bb", "ccc", "dddd", "eeeee");
+    }
+
+    @Test(expectedExceptions = ClassCastException.class)
+    public void unable_to_sort_a_flow_of_non_comparables()
+    {
+        Flow<Locale> flow = F.flow(Locale.ENGLISH, Locale.FRANCE);
+
+        flow.sort();
+    }
 }