Skip to content

Commit 47eccfe

Browse files
committed
Reverse deforests (to direct iteration if nesting-level % 2 == 1)
speeding up other tests
1 parent 1a8548f commit 47eccfe

File tree

6 files changed

+47
-5
lines changed

6 files changed

+47
-5
lines changed

src/main/java/com/jnape/palatable/lambda/functions/builtin/fn1/Reverse.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.jnape.palatable.lambda.functions.builtin.fn1;
22

33
import com.jnape.palatable.lambda.functions.Fn1;
4-
import com.jnape.palatable.lambda.iteration.ReversingIterator;
4+
import com.jnape.palatable.lambda.iteration.ReversingIterable;
55

66
/**
77
* Given an <code>Iterable</code>, return a reversed representation of that <code>Iterable</code>. Note that reversing
@@ -18,7 +18,7 @@ private Reverse() {
1818

1919
@Override
2020
public Iterable<A> apply(Iterable<A> as) {
21-
return () -> new ReversingIterator<>(as.iterator());
21+
return new ReversingIterable<>(as);
2222
}
2323

2424
@SuppressWarnings("unchecked")
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.jnape.palatable.lambda.iteration;
2+
3+
import java.util.Iterator;
4+
5+
public final class ReversingIterable<A> implements Iterable<A> {
6+
private final Iterable<A> as;
7+
private final boolean reverse;
8+
9+
public ReversingIterable(Iterable<A> as) {
10+
boolean reverse = true;
11+
while (as instanceof ReversingIterable) {
12+
ReversingIterable<A> nested = (ReversingIterable<A>) as;
13+
as = nested.as;
14+
reverse = !nested.reverse;
15+
}
16+
this.as = as;
17+
this.reverse = reverse;
18+
}
19+
20+
@Override
21+
public Iterator<A> iterator() {
22+
return reverse ? new ReversingIterator<>(as.iterator()) : as.iterator();
23+
}
24+
}

src/test/java/com/jnape/palatable/lambda/functions/builtin/fn1/TailsTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,6 @@ public void nonEmpty() {
4949

5050
@Test
5151
public void largeNumberOfElements() {
52-
assertEquals(just(emptyList()), last(tails(take(100000, repeat(1)))));
52+
assertEquals(just(emptyList()), last(tails(take(10_000, repeat(1)))));
5353
}
5454
}

src/test/java/com/jnape/palatable/lambda/iteration/ConcatenatingIteratorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public void nextPullsFromXsFirstThenFromYs() {
8585

8686
@Test
8787
public void stackSafety() {
88-
Integer stackBlowingNumber = 50000;
88+
Integer stackBlowingNumber = 10_000;
8989
Iterable<Iterable<Integer>> xss = map(Collections::singleton, take(stackBlowingNumber, iterate(x -> x + 1, 1)));
9090
Iterable<Integer> deeplyNestedConcat = foldRight((xs, ys) -> () -> new ConcatenatingIterator<>(xs, ys),
9191
(Iterable<Integer>) Collections.<Integer>emptySet(),

src/test/java/com/jnape/palatable/lambda/iteration/ConsingIteratorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public void doesNotHaveNextIfNoElementsLeft() {
5050

5151
@Test
5252
public void stackSafety() {
53-
Integer stackBlowingNumber = 1000000;
53+
Integer stackBlowingNumber = 10_000;
5454
Iterable<Integer> ints = foldRight((x, acc) -> () -> new ConsingIterator<>(x, acc),
5555
(Iterable<Integer>) Collections.<Integer>emptyList(),
5656
take(stackBlowingNumber, iterate(x -> x + 1, 1)));
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.jnape.palatable.lambda.iteration;
2+
3+
import com.jnape.palatable.lambda.functions.Fn1;
4+
import com.jnape.palatable.traitor.annotations.TestTraits;
5+
import com.jnape.palatable.traitor.runners.Traits;
6+
import org.junit.runner.RunWith;
7+
import testsupport.traits.Deforesting;
8+
9+
import static com.jnape.palatable.lambda.functions.builtin.fn1.Reverse.reverse;
10+
11+
@RunWith(Traits.class)
12+
public class ReversingIterableTest {
13+
14+
@TestTraits({Deforesting.class})
15+
public Fn1<Iterable<Integer>, Iterable<Integer>> testSubject() {
16+
return reverse();
17+
}
18+
}

0 commit comments

Comments
 (0)