Skip to content

Commit a929f92

Browse files
committed
Sequence#sequence requires 2 fewer type parameters
1 parent 6f30dee commit a929f92

File tree

2 files changed

+33
-38
lines changed

2 files changed

+33
-38
lines changed

src/main/java/com/jnape/palatable/lambda/functions/builtin/fn2/Sequence.java

Lines changed: 28 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -24,82 +24,72 @@
2424
* @param <A> the Traversable element type
2525
* @param <App> the Applicative unification parameter
2626
* @param <Trav> the Traversable unification parameter
27-
* @param <AppA> the Applicative instance wrapped in the input Traversable
2827
* @param <TravA> the Traversable instance wrapped in the output Applicative
2928
* @param <AppTrav> the concrete parametrized output Applicative type
30-
* @param <TravApp> the concrete parametrized input Traversable type
3129
*/
3230
public final class Sequence<A, App extends Applicative<?, App>, Trav extends Traversable<?, Trav>,
33-
AppA extends Applicative<A, App>,
3431
TravA extends Traversable<A, Trav>,
35-
AppTrav extends Applicative<TravA, App>,
36-
TravApp extends Traversable<AppA, Trav>> implements Fn2<TravApp, Fn1<TravA, ? extends AppTrav>, AppTrav> {
32+
AppTrav extends Applicative<TravA, App>> implements
33+
Fn2<Traversable<? extends Applicative<A, App>, Trav>, Fn1<TravA, ? extends AppTrav>, AppTrav> {
3734

38-
private static final Sequence<?, ?, ?, ?, ?, ?, ?> INSTANCE = new Sequence<>();
35+
private static final Sequence<?, ?, ?, ?, ?> INSTANCE = new Sequence<>();
3936

4037
private Sequence() {
4138
}
4239

4340
@Override
44-
public AppTrav checkedApply(TravApp traversable, Fn1<TravA, ? extends AppTrav> pure) {
41+
public AppTrav checkedApply(Traversable<? extends Applicative<A, App>, Trav> traversable,
42+
Fn1<TravA, ? extends AppTrav> pure) {
4543
return traversable.traverse(id(), pure);
4644
}
4745

4846
@SuppressWarnings("unchecked")
4947
public static <A, App extends Applicative<?, App>, Trav extends Traversable<?, Trav>,
50-
AppA extends Applicative<A, App>,
5148
TravA extends Traversable<A, Trav>,
52-
AppTrav extends Applicative<TravA, App>,
53-
TravApp extends Traversable<AppA, Trav>> Sequence<A, App, Trav, AppA, TravA, AppTrav, TravApp> sequence() {
54-
return (Sequence<A, App, Trav, AppA, TravA, AppTrav, TravApp>) INSTANCE;
49+
AppTrav extends Applicative<TravA, App>> Sequence<A, App, Trav, TravA, AppTrav> sequence() {
50+
return (Sequence<A, App, Trav, TravA, AppTrav>) INSTANCE;
5551
}
5652

5753
public static <A, App extends Applicative<?, App>, Trav extends Traversable<?, Trav>,
58-
AppA extends Applicative<A, App>,
5954
TravA extends Traversable<A, Trav>,
60-
AppTrav extends Applicative<TravA, App>,
61-
TravApp extends Traversable<AppA, Trav>> Fn1<Fn1<TravA, ? extends AppTrav>, AppTrav> sequence(
62-
TravApp traversable) {
63-
return Sequence.<A, App, Trav, AppA, TravA, AppTrav, TravApp>sequence().apply(traversable);
55+
AppTrav extends Applicative<TravA, App>> Fn1<Fn1<TravA, ? extends AppTrav>, AppTrav> sequence(
56+
Traversable<? extends Applicative<A, App>, Trav> traversable) {
57+
return Sequence.<A, App, Trav, TravA, AppTrav>sequence().apply(traversable);
6458
}
6559

6660
public static <A, App extends Applicative<?, App>, Trav extends Traversable<?, Trav>,
6761
TravA extends Traversable<A, Trav>,
68-
AppA extends Applicative<A, App>,
69-
AppTrav extends Applicative<TravA, App>,
70-
TravApp extends Traversable<AppA, Trav>> AppTrav sequence(TravApp traversable,
71-
Fn1<TravA, ? extends AppTrav> pure) {
72-
return Sequence.<A, App, Trav, AppA, TravA, AppTrav, TravApp>sequence(traversable).apply(pure);
62+
AppTrav extends Applicative<TravA, App>> AppTrav sequence(
63+
Traversable<? extends Applicative<A, App>, Trav> traversable,
64+
Fn1<TravA, ? extends AppTrav> pure) {
65+
return Sequence.<A, App, Trav, TravA, AppTrav>sequence(traversable).apply(pure);
7366
}
7467

7568
@SuppressWarnings({"unchecked", "RedundantTypeArguments"})
76-
public static <A, App extends Applicative<?, App>, AppA extends Applicative<A, App>,
77-
AppIterable extends Applicative<Iterable<A>, App>,
78-
IterableApp extends Iterable<AppA>>
79-
Fn1<Fn1<Iterable<A>, ? extends AppIterable>, AppIterable> sequence(IterableApp iterableApp) {
80-
return pure -> (AppIterable) Sequence.<A, App, LambdaIterable<?>, LambdaIterable<A>, AppA, Applicative<LambdaIterable<A>, App>, LambdaIterable<AppA>>sequence(
69+
public static <A, App extends Applicative<?, App>, AppIterable extends Applicative<Iterable<A>, App>>
70+
Fn1<Fn1<Iterable<A>, ? extends AppIterable>, AppIterable> sequence(
71+
Iterable<? extends Applicative<A, App>> iterableApp) {
72+
return pure -> (AppIterable) Sequence.<A, App, LambdaIterable<?>, LambdaIterable<A>, Applicative<LambdaIterable<A>, App>>sequence(
8173
LambdaIterable.wrap(iterableApp), x -> pure.apply(x.unwrap()).fmap(LambdaIterable::wrap))
8274
.fmap(LambdaIterable::unwrap);
8375
}
8476

85-
public static <A, App extends Applicative<?, App>, AppA extends Applicative<A, App>,
86-
AppIterable extends Applicative<Iterable<A>, App>, IterableApp extends Iterable<AppA>>
87-
AppIterable sequence(IterableApp iterableApp, Fn1<Iterable<A>, ? extends AppIterable> pure) {
88-
return Sequence.<A, App, AppA, AppIterable, IterableApp>sequence(iterableApp).apply(pure);
77+
public static <A, App extends Applicative<?, App>, AppIterable extends Applicative<Iterable<A>, App>>
78+
AppIterable sequence(Iterable<? extends Applicative<A, App>> iterableApp,
79+
Fn1<Iterable<A>, ? extends AppIterable> pure) {
80+
return Sequence.<A, App, AppIterable>sequence(iterableApp).apply(pure);
8981
}
9082

9183
@SuppressWarnings({"unchecked", "RedundantTypeArguments"})
92-
public static <A, B, App extends Applicative<?, App>, AppB extends Applicative<B, App>,
93-
AppMap extends Applicative<Map<A, B>, App>, MapApp extends Map<A, AppB>>
94-
Fn1<Fn1<Map<A, B>, ? extends AppMap>, AppMap> sequence(MapApp mapApp) {
95-
return pure -> (AppMap) Sequence.<B, App, LambdaMap<A, ?>, LambdaMap<A, B>, AppB, Applicative<LambdaMap<A, B>, App>, LambdaMap<A, AppB>>sequence(
84+
public static <A, B, App extends Applicative<?, App>, AppMap extends Applicative<Map<A, B>, App>>
85+
Fn1<Fn1<Map<A, B>, ? extends AppMap>, AppMap> sequence(Map<A, ? extends Applicative<B, App>> mapApp) {
86+
return pure -> (AppMap) Sequence.<B, App, LambdaMap<A, ?>, LambdaMap<A, B>, Applicative<LambdaMap<A, B>, App>>sequence(
9687
LambdaMap.wrap(mapApp), x -> pure.apply(x.unwrap()).fmap(LambdaMap::wrap))
9788
.fmap(LambdaMap::unwrap);
9889
}
9990

100-
public static <A, B, App extends Applicative<?, App>, AppB extends Applicative<B, App>,
101-
AppMap extends Applicative<Map<A, B>, App>, MapApp extends Map<A, AppB>>
102-
AppMap sequence(MapApp mapApp, Fn1<Map<A, B>, ? extends AppMap> pure) {
103-
return Sequence.<A, B, App, AppB, AppMap, MapApp>sequence(mapApp).apply(pure);
91+
public static <A, B, App extends Applicative<?, App>, AppMap extends Applicative<Map<A, B>, App>>
92+
AppMap sequence(Map<A, ? extends Applicative<B, App>> mapApp, Fn1<Map<A, B>, ? extends AppMap> pure) {
93+
return Sequence.<A, B, App, AppMap>sequence(mapApp).apply(pure);
10494
}
10595
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import com.jnape.palatable.lambda.functor.builtin.Identity;
88
import org.junit.Test;
99

10+
import java.util.Map;
11+
1012
import static com.jnape.palatable.lambda.adt.Either.right;
1113
import static com.jnape.palatable.lambda.adt.Maybe.just;
1214
import static com.jnape.palatable.lambda.functions.builtin.fn1.Id.id;
@@ -68,5 +70,8 @@ public void compilation() {
6870

6971
Maybe<Iterable<Integer>> d = sequence(asList(just(1), just(2)), Maybe::just);
7072
assertThat(d.orElseThrow(AssertionError::new), iterates(1, 2));
73+
74+
Either<String, Map<String, Integer>> e = sequence(singletonMap("foo", right(1)), Either::right);
75+
assertEquals(right(singletonMap("foo", 1)), e);
7176
}
7277
}

0 commit comments

Comments
 (0)