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