You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2010/06/04 07:06:44 UTC
svn commit: r951266 - in /tapestry/tapestry5/trunk/tapestry-func/src:
main/java/org/apache/tapestry5/func/ test/java/org/apache/tapestry5/func/
Author: hlship
Date: Fri Jun 4 05:06:43 2010
New Revision: 951266
URL: http://svn.apache.org/viewvc?rev=951266&view=rev
Log:
Add a Mapper2 abstract calls, and a Flow.map() method for mapping with values from two Flows
Added:
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMapped2Value.java
- copied, changed from r951204, tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMappedValue.java
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMapper2.java
- copied, changed from r951204, tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMapper.java
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/Mapper2.java
- copied, changed from r951204, tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMappedValue.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/F.java
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/Flow.java
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMappedValue.java
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMapper.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/AbstractFlow.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/AbstractFlow.java?rev=951266&r1=951265&r2=951266&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 Fri Jun 4 05:06:43 2010
@@ -119,6 +119,17 @@ abstract class AbstractFlow<T> implement
return F.lazy(new LazyMapper<T, X>(mapper, this));
}
+ public <X, Y> Flow<Y> map(Mapper2<T, X, Y> mapper, Flow<? extends X> flow)
+ {
+ assert mapper != null;
+ assert flow != null;
+
+ if (this.isEmpty() || flow.isEmpty())
+ return F.emptyFlow();
+
+ return F.lazy(new LazyMapper2<T, X, Y>(mapper, this, flow));
+ }
+
public <A> A reduce(Reducer<A, T> reducer, A initial)
{
assert reducer != null;
@@ -210,4 +221,5 @@ abstract class AbstractFlow<T> implement
return F.lazy(new LazyDrop<T>(length, 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=951266&r1=951265&r2=951266&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 Fri Jun 4 05:06:43 2010
@@ -204,6 +204,14 @@ public class F
};
};
+ public static Mapper2<Integer, Integer, Integer> ADD_INTS = new Mapper2<Integer, Integer, Integer>()
+ {
+ public Integer map(Integer first, Integer second)
+ {
+ return first + second;
+ };
+ };
+
/**
* Extracts the values from the collection to form a {@link Flow}. The Collection
* may change after the Flow is created without affecting the Flow.
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=951266&r1=951265&r2=951266&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 Fri Jun 4 05:06:43 2010
@@ -38,10 +38,18 @@ import java.util.List;
*/
public interface Flow<T> extends Iterable<T>
{
- /** Maps a Flow into a new Flow with different type values. */
+ /** Maps a Flow into a new Flow with different type values. Mapping is a lazy operation. */
<X> Flow<X> map(Mapper<T, X> mapper);
/**
+ * Combines two Flows using a two-parameter Mapper. Each value of
+ * this Flow, and the corresponding value of the other flow are passed through the Mapper
+ * to provide the values of the output Flow. The length of the result Flow is
+ * the smaller of the lengths of the two input Flows. Mapping is a lazy operation.
+ */
+ <X, Y> Flow<Y> map(Mapper2<T, X, Y> mapper, Flow<? extends X> flow);
+
+ /**
* Given a {@link Mapper} that maps a T to a Flow<X>, this method will lazily concatenate
* all the output flows into a single Flow<X>.
*/
Copied: tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMapped2Value.java (from r951204, tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMappedValue.java)
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMapped2Value.java?p2=tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMapped2Value.java&p1=tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMappedValue.java&r1=951204&r2=951266&rev=951266&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMappedValue.java (original)
+++ tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMapped2Value.java Fri Jun 4 05:06:43 2010
@@ -14,20 +14,24 @@
package org.apache.tapestry5.func;
-class LazyMappedValue<T, X> implements LazyValue<X>
+class LazyMapped2Value<T, X, Y> implements LazyValue<Y>
{
- private final T input;
+ private final Flow<T> left;
- private final Mapper<T, X> mapper;
+ private final Flow<X> right;
- public LazyMappedValue(T input, Mapper<T, X> mapper)
+ private final Mapper2<T, X, Y> mapper;
+
+ public LazyMapped2Value(Flow<T> left, Flow<X> right, Mapper2<T, X, Y> mapper)
{
- this.input = input;
+ this.left = left;
+ this.right = right;
this.mapper = mapper;
}
- public X get()
+ public Y get()
{
- return mapper.map(input);
+ return mapper.map(left.first(), right.first());
}
+
}
Modified: tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMappedValue.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMappedValue.java?rev=951266&r1=951265&r2=951266&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMappedValue.java (original)
+++ tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMappedValue.java Fri Jun 4 05:06:43 2010
@@ -16,18 +16,18 @@ package org.apache.tapestry5.func;
class LazyMappedValue<T, X> implements LazyValue<X>
{
- private final T input;
+ private final Flow<T> flow;
private final Mapper<T, X> mapper;
- public LazyMappedValue(T input, Mapper<T, X> mapper)
+ public LazyMappedValue(Flow<T> input, Mapper<T, X> mapper)
{
- this.input = input;
+ this.flow = input;
this.mapper = mapper;
}
public X get()
{
- return mapper.map(input);
+ return mapper.map(flow.first());
}
}
Modified: tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMapper.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMapper.java?rev=951266&r1=951265&r2=951266&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMapper.java (original)
+++ tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMapper.java Fri Jun 4 05:06:43 2010
@@ -31,8 +31,9 @@ class LazyMapper<T, X> implements LazyFu
if (flow.isEmpty())
return null;
- return new LazyContinuation<X>(new LazyMappedValue<T, X>(flow.first(), mapper), new LazyMapper<T, X>(mapper,
- flow.rest()));
+ LazyValue<X> nextValue = new LazyMappedValue<T, X>(flow, mapper);
+
+ return new LazyContinuation<X>(nextValue, new LazyMapper<T, X>(mapper, flow.rest()));
}
}
Copied: tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMapper2.java (from r951204, tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMapper.java)
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMapper2.java?p2=tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMapper2.java&p1=tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMapper.java&r1=951204&r2=951266&rev=951266&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMapper.java (original)
+++ tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMapper2.java Fri Jun 4 05:06:43 2010
@@ -14,25 +14,29 @@
package org.apache.tapestry5.func;
-class LazyMapper<T, X> implements LazyFunction<X>
+class LazyMapper2<T, X, Y> implements LazyFunction<Y>
{
- private final Mapper<T, X> mapper;
+ private final Mapper2<T, X, Y> mapper;
- private final Flow<T> flow;
+ private final Flow<T> left;
- public LazyMapper(Mapper<T, X> mapper, Flow<T> flow)
+ private final Flow<X> right;
+
+ @SuppressWarnings("unchecked")
+ public LazyMapper2(Mapper2<T, X, Y> mapper, Flow<T> left, Flow<? extends X> right)
{
this.mapper = mapper;
- this.flow = flow;
+ this.left = left;
+ this.right = (Flow<X>) right;
}
- public LazyContinuation<X> next()
+ public LazyContinuation<Y> next()
{
- if (flow.isEmpty())
+ if (left.isEmpty() || right.isEmpty())
return null;
- return new LazyContinuation<X>(new LazyMappedValue<T, X>(flow.first(), mapper), new LazyMapper<T, X>(mapper,
- flow.rest()));
- }
+ LazyValue<Y> nextValue = new LazyMapped2Value<T, X, Y>(left, right, mapper);
+ return new LazyContinuation<Y>(nextValue, new LazyMapper2<T, X, Y>(mapper, left.rest(), right.rest()));
+ }
}
Copied: tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/Mapper2.java (from r951204, tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMappedValue.java)
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/Mapper2.java?p2=tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/Mapper2.java&p1=tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMappedValue.java&r1=951204&r2=951266&rev=951266&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/LazyMappedValue.java (original)
+++ tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/Mapper2.java Fri Jun 4 05:06:43 2010
@@ -14,20 +14,14 @@
package org.apache.tapestry5.func;
-class LazyMappedValue<T, X> implements LazyValue<X>
+/**
+ * A generalization of {@link Mapper} for a two-input function.
+ */
+public abstract class Mapper2<A, B, C>
{
- private final T input;
-
- private final Mapper<T, X> mapper;
-
- public LazyMappedValue(T input, Mapper<T, X> mapper)
- {
- this.input = input;
- this.mapper = mapper;
- }
-
- public X get()
- {
- return mapper.map(input);
- }
+ /**
+ * Take, as input, two values (from two flows) and return a computed value of
+ * the third type.
+ */
+ public abstract C map(A first, B second);
}
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=951266&r1=951265&r2=951266&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 Fri Jun 4 05:06:43 2010
@@ -146,6 +146,23 @@ public class MapperTest extends BaseFunc
assertFlowValues(flow.take(3), 2, 4, 6);
assertEquals(count.get(), 1);
+ }
+
+ @Test
+ public void map2_empty_is_the_empty_flow()
+ {
+ Flow<Integer> flow = F.flow(1, 2, 3);
+
+ assertSame(flow.map(F.ADD_INTS, filteredEmpty), F.EMPTY_FLOW);
+ assertSame(filteredEmpty.map(F.ADD_INTS, flow), F.EMPTY_FLOW);
+ }
+
+ @Test
+ public void map2()
+ {
+ Flow<Integer> left = F.range(10, 13);
+ Flow<Integer> right = F.series(20, 2);
+ assertFlowValues(left.map(F.ADD_INTS, right), 10 + 20, 11 + 22, 12 + 24);
}
}