Skip to content

Commit 745d308

Browse files
committed
Intersperse
1 parent d24dadf commit 745d308

4 files changed

Lines changed: 100 additions & 1 deletion

File tree

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.jnape.palatable.lambda.functions.builtin.fn2;
2+
3+
import com.jnape.palatable.lambda.functions.Fn1;
4+
import com.jnape.palatable.lambda.functions.Fn2;
5+
6+
import static com.jnape.palatable.lambda.functions.builtin.fn1.Tail.tail;
7+
import static com.jnape.palatable.lambda.functions.builtin.fn2.PrependAll.prependAll;
8+
9+
public final class Intersperse<A> implements Fn2<A, Iterable<A>, Iterable<A>> {
10+
11+
private static final Intersperse INSTANCE = new Intersperse();
12+
13+
private Intersperse() {
14+
}
15+
16+
@Override
17+
public Iterable<A> apply(A a, Iterable<A> as) {
18+
return tail(prependAll(a, as));
19+
}
20+
21+
@SuppressWarnings("unchecked")
22+
public static <A> Intersperse<A> intersperse() {
23+
return INSTANCE;
24+
}
25+
26+
public static <A> Fn1<Iterable<A>, Iterable<A>> intersperse(A a) {
27+
return Intersperse.<A>intersperse().apply(a);
28+
}
29+
30+
public static <A> Iterable<A> intersperse(A a, Iterable<A> as) {
31+
return intersperse(a).apply(as);
32+
}
33+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.jnape.palatable.lambda.functions.builtin.fn2;
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.Test;
7+
import org.junit.runner.RunWith;
8+
import testsupport.traits.FiniteIteration;
9+
import testsupport.traits.ImmutableIteration;
10+
import testsupport.traits.InfiniteIterableSupport;
11+
import testsupport.traits.Laziness;
12+
13+
import static com.jnape.palatable.lambda.functions.builtin.fn2.Intersperse.intersperse;
14+
import static java.util.Arrays.asList;
15+
import static java.util.Collections.emptyList;
16+
import static org.junit.Assert.assertThat;
17+
import static testsupport.matchers.IterableMatcher.isEmpty;
18+
import static testsupport.matchers.IterableMatcher.iterates;
19+
20+
@RunWith(Traits.class)
21+
public class IntersperseTest {
22+
23+
@TestTraits({Laziness.class, FiniteIteration.class, ImmutableIteration.class, InfiniteIterableSupport.class})
24+
public Fn1<Iterable<Object>, Iterable<Object>> testSubject() {
25+
return intersperse(0);
26+
}
27+
28+
@Test
29+
public void interspersesBetweenElementsInIterable() {
30+
assertThat(intersperse(0, asList(1, 2, 3)), iterates(1, 0, 2, 0, 3));
31+
}
32+
33+
@Test
34+
public void doesNotIntersperseEmptyIterable() {
35+
assertThat(intersperse(0, emptyList()), isEmpty());
36+
}
37+
}

src/test/java/com/jnape/palatable/lambda/functions/builtin/fn2/PrependAllTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import testsupport.traits.EmptyIterableSupport;
99
import testsupport.traits.FiniteIteration;
1010
import testsupport.traits.ImmutableIteration;
11+
import testsupport.traits.InfiniteIterableSupport;
1112
import testsupport.traits.Laziness;
1213

1314
import static com.jnape.palatable.lambda.functions.builtin.fn2.PrependAll.prependAll;
@@ -20,7 +21,7 @@
2021
@RunWith(Traits.class)
2122
public class PrependAllTest {
2223

23-
@TestTraits({Laziness.class, FiniteIteration.class, EmptyIterableSupport.class, ImmutableIteration.class})
24+
@TestTraits({Laziness.class, FiniteIteration.class, EmptyIterableSupport.class, ImmutableIteration.class, InfiniteIterableSupport.class})
2425
public Fn1<Iterable<Object>, Iterable<Object>> testSubject() {
2526
return prependAll(0);
2627
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package testsupport.traits;
2+
3+
import com.jnape.palatable.lambda.functions.Fn1;
4+
import com.jnape.palatable.traitor.traits.Trait;
5+
6+
import java.util.concurrent.CountDownLatch;
7+
8+
import static com.jnape.palatable.lambda.functions.builtin.fn1.Repeat.repeat;
9+
import static java.util.concurrent.TimeUnit.SECONDS;
10+
import static org.junit.Assert.fail;
11+
12+
public class InfiniteIterableSupport implements Trait<Fn1<Iterable, Iterable>> {
13+
14+
@Override
15+
public void test(Fn1<Iterable, Iterable> testSubject) {
16+
CountDownLatch latch = new CountDownLatch(1);
17+
new Thread(() -> {
18+
testSubject.apply(repeat(0)).iterator().next();
19+
latch.countDown();
20+
}).start();
21+
try {
22+
if (!latch.await(1, SECONDS))
23+
fail("Termination when given an infinite iterable could not be proven in time");
24+
} catch (InterruptedException e) {
25+
throw new AssertionError("interrupted", e);
26+
}
27+
}
28+
}

0 commit comments

Comments
 (0)