Skip to content

Commit 8ae9df8

Browse files
committed
Union deforests
1 parent ed6dac7 commit 8ae9df8

File tree

5 files changed

+53
-24
lines changed

5 files changed

+53
-24
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.jnape.palatable.lambda.iteration;
2+
3+
import java.util.Iterator;
4+
5+
import static com.jnape.palatable.lambda.functions.builtin.fn1.Distinct.distinct;
6+
7+
public final class UnioningIterable<A> implements Iterable<A> {
8+
9+
private final ConcatenatingIterable<A> elements;
10+
11+
public UnioningIterable(Iterable<A> xs, Iterable<A> ys) {
12+
elements = new ConcatenatingIterable<>(xs instanceof UnioningIterable ? ((UnioningIterable<A>) xs).elements : xs,
13+
ys instanceof UnioningIterable ? ((UnioningIterable<A>) ys).elements : ys);
14+
}
15+
16+
@Override
17+
public Iterator<A> iterator() {
18+
return distinct(elements).iterator();
19+
}
20+
}

src/main/java/com/jnape/palatable/lambda/monoid/builtin/Union.java

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

33
import com.jnape.palatable.lambda.functions.Fn1;
4+
import com.jnape.palatable.lambda.iteration.UnioningIterable;
45
import com.jnape.palatable.lambda.monoid.Monoid;
56

67
import java.util.Collections;
78

8-
import static com.jnape.palatable.lambda.functions.builtin.fn1.Distinct.distinct;
9-
import static com.jnape.palatable.lambda.monoid.builtin.Concat.concat;
10-
119
/**
1210
* Given two {@link Iterable}s, return the union of all unique occurrences of elements between them. Note that this
1311
* operation preserves order, so the unique elements of the first {@link Iterable} are iterated before the unique
@@ -29,7 +27,7 @@ public Iterable<A> identity() {
2927

3028
@Override
3129
public Iterable<A> apply(Iterable<A> xs, Iterable<A> ys) {
32-
return distinct(concat(xs, ys));
30+
return new UnioningIterable<>(xs, ys);
3331
}
3432

3533
@SuppressWarnings("unchecked")
Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,15 @@
11
package com.jnape.palatable.lambda.iteration;
22

33
import com.jnape.palatable.lambda.functions.Fn1;
4-
import com.jnape.palatable.lambda.monoid.builtin.Concat;
54
import com.jnape.palatable.traitor.annotations.TestTraits;
65
import com.jnape.palatable.traitor.framework.Subjects;
76
import com.jnape.palatable.traitor.runners.Traits;
8-
import org.junit.Test;
97
import org.junit.runner.RunWith;
108
import testsupport.traits.Deforesting;
119

12-
import static com.jnape.palatable.lambda.adt.Maybe.just;
13-
import static com.jnape.palatable.lambda.functions.builtin.fn1.Last.last;
1410
import static com.jnape.palatable.lambda.functions.builtin.fn1.Repeat.repeat;
15-
import static com.jnape.palatable.lambda.functions.builtin.fn2.Replicate.replicate;
1611
import static com.jnape.palatable.traitor.framework.Subjects.subjects;
17-
import static java.util.Arrays.asList;
1812
import static java.util.Collections.emptyList;
19-
import static org.junit.Assert.assertEquals;
2013

2114
@RunWith(Traits.class)
2215
public class ConcatenatingIterableTest {
@@ -28,10 +21,4 @@ public Subjects<Fn1<Iterable<Integer>, Iterable<Integer>>> testSubject() {
2821
xs -> new ConcatenatingIterable<>(repeat(1), xs),
2922
xs -> new ConcatenatingIterable<>(xs, repeat(1)));
3023
}
31-
32-
@Test
33-
public void stackSafety() {
34-
Iterable<Integer> xs = Concat.<Integer>concat().reduceLeft(replicate(1_000_000, asList(1, 2, 3)));
35-
assertEquals(just(3), last(xs));
36-
}
3724
}
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 com.jnape.palatable.lambda.functions.Fn1;
4+
import com.jnape.palatable.traitor.annotations.TestTraits;
5+
import com.jnape.palatable.traitor.framework.Subjects;
6+
import com.jnape.palatable.traitor.runners.Traits;
7+
import org.junit.runner.RunWith;
8+
import testsupport.traits.Deforesting;
9+
10+
import static com.jnape.palatable.lambda.functions.builtin.fn1.Repeat.repeat;
11+
import static com.jnape.palatable.traitor.framework.Subjects.subjects;
12+
import static java.util.Collections.emptyList;
13+
14+
@RunWith(Traits.class)
15+
public class UnioningIterableTest {
16+
@TestTraits({Deforesting.class})
17+
public Subjects<Fn1<Iterable<Integer>, Iterable<Integer>>> testSubject() {
18+
return subjects(xs -> new UnioningIterable<>(emptyList(), xs),
19+
xs -> new UnioningIterable<>(xs, emptyList()),
20+
xs -> new UnioningIterable<>(repeat(1), xs),
21+
xs -> new UnioningIterable<>(xs, repeat(1)));
22+
}
23+
24+
}

src/test/java/com/jnape/palatable/lambda/monoid/builtin/UnionTest.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,19 @@
22

33
import com.jnape.palatable.lambda.functions.Fn1;
44
import com.jnape.palatable.traitor.annotations.TestTraits;
5+
import com.jnape.palatable.traitor.framework.Subjects;
56
import com.jnape.palatable.traitor.runners.Traits;
67
import org.junit.Test;
78
import org.junit.runner.RunWith;
9+
import testsupport.traits.Deforesting;
810
import testsupport.traits.EmptyIterableSupport;
911
import testsupport.traits.FiniteIteration;
1012
import testsupport.traits.ImmutableIteration;
1113
import testsupport.traits.InfiniteIterableSupport;
1214
import testsupport.traits.Laziness;
1315

1416
import static com.jnape.palatable.lambda.monoid.builtin.Union.union;
17+
import static com.jnape.palatable.traitor.framework.Subjects.subjects;
1518
import static java.util.Arrays.asList;
1619
import static java.util.Collections.emptyList;
1720
import static java.util.Collections.singletonList;
@@ -22,18 +25,15 @@
2225
@RunWith(Traits.class)
2326
public class UnionTest {
2427

25-
@TestTraits({Laziness.class, InfiniteIterableSupport.class, EmptyIterableSupport.class, FiniteIteration.class, ImmutableIteration.class})
26-
public Fn1<Iterable<Integer>, Iterable<Integer>> testSubject() {
27-
return union(asList(1, 2, 3));
28+
@TestTraits({Laziness.class, InfiniteIterableSupport.class, EmptyIterableSupport.class, FiniteIteration.class, ImmutableIteration.class, Deforesting.class})
29+
public Subjects<Fn1<Iterable<Integer>, Iterable<Integer>>> testSubject() {
30+
return subjects(union(asList(1, 2, 3)), Union.<Integer>union().flip().apply(asList(1, 2, 3)));
2831
}
2932

3033
@Test
31-
public void identity() {
34+
public void monoid() {
3235
assertThat(union().identity(), isEmpty());
33-
}
3436

35-
@Test
36-
public void semigroup() {
3737
assertThat(union(emptyList(), emptyList()), isEmpty());
3838
assertThat(union(asList(1, 2), emptyList()), iterates(1, 2));
3939
assertThat(union(emptyList(), singletonList(3)), iterates(3));

0 commit comments

Comments
 (0)