From ca6df3178106c0933c916cc2f5435c7804d53dd3 Mon Sep 17 00:00:00 2001 From: dpoeira Date: Wed, 28 Oct 2020 12:16:27 +0000 Subject: [PATCH] Fixed a bug where the first element of a Query was being iterated twice when the source was a list in conjunction with the reduce operation. --- .../java/org/jayield/advs/AdvancerList.java | 7 +++++- .../java/org/jayield/QueryTraverseTest.java | 24 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/jayield/advs/AdvancerList.java b/src/main/java/org/jayield/advs/AdvancerList.java index 98d32f5..6983599 100644 --- a/src/main/java/org/jayield/advs/AdvancerList.java +++ b/src/main/java/org/jayield/advs/AdvancerList.java @@ -25,14 +25,17 @@ public class AdvancerList implements Advancer { private final List data; private final Iterator current; + private int index; public AdvancerList(List data) { this.data = data; this.current = data.iterator(); + index = 0; } @Override public U next() { + index++; return current.next(); } @@ -43,6 +46,8 @@ public boolean hasNext() { @Override public void traverse(Yield yield) { - data.forEach(yield::ret); + for (int i = index; i < data.size(); i++) { + yield.ret(data.get(i)); + } } } diff --git a/src/test/java/org/jayield/QueryTraverseTest.java b/src/test/java/org/jayield/QueryTraverseTest.java index bfdffb1..3b9ba4e 100644 --- a/src/test/java/org/jayield/QueryTraverseTest.java +++ b/src/test/java/org/jayield/QueryTraverseTest.java @@ -17,6 +17,7 @@ package org.jayield; import static java.util.Arrays.asList; +import static org.jayield.Query.fromList; import static org.jayield.Query.fromStream; import static org.jayield.Query.iterate; import static org.jayield.Query.of; @@ -293,6 +294,29 @@ public void testReduce() { assertEquals(actual, expected); } + @Test + public void testFlatMapAndReduce() { + List> input = new ArrayList<>(); + input.add(Query.of("a")); + input.add(Query.of("b")); + input.add(Query.of("c")); + String expected = "abc"; + String actual = fromList(input).flatMap(s -> s).reduce((p, c) -> p + c).orElseThrow(); + assertEquals(actual, expected); + } + + + @Test + public void testFromListFlatMapAndReduce() { + List> input = new ArrayList<>(); + input.add(fromList(List.of("a"))); + input.add(fromList(List.of("b"))); + input.add(fromList(List.of("c"))); + String expected = "abc"; + String actual = fromList(input).flatMap(s -> s).reduce((p, c) -> p + c).orElseThrow(); + assertEquals(actual, expected); + } + @Test public void testReduceOnEmpty() { String[] input = {};