Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit68a20e0

Browse files
committed
Sequence is now better at inferring the target type
1 parentd43695a commit68a20e0

File tree

3 files changed

+62
-35
lines changed

3 files changed

+62
-35
lines changed

‎CHANGELOG.md

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,14 @@ All notable changes to this project will be documented in this file.
44
The format is based on[Keep a Changelog](http://keepachangelog.com/).
55

66
##[Unreleased]
7+
###Changed
8+
-***Breaking Change***:`Sequence` now has two more type parameters to aid in inference
9+
-`Bifunctor` is now a`BoundedBifunctor` where both parameter upper bounds are`Object`
10+
-`Peek2` now accepts the more general`BoundedBifunctor`
11+
-`Identity`,`Compose`, and`Const` functors all have better`toString` implementations
12+
-`Into3-8` now supports functions with parameter variance
13+
-`HListLens#tail` is now covariant in`Tail` parameter
14+
715
###Added
816
-`BoundedBifunctor`, a`Bifunctor` super type that offers upper bounds for both parameters
917
-`Try`, a`Monad` representing an expression-like analog of`try/catch/finally`
@@ -12,13 +20,6 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/).
1220
-`Kleisli`, the abstract representation of a`Kleisli` arrow (`Monad#flatMap`) as an`Fn1`
1321
-`These`, a`CoProduct3` of`A`,`B`, or`Tuple2<A,B>`
1422

15-
###Changed
16-
-`Bifunctor` is now a`BoundedBifunctor` where both parameter upper bounds are`Object`
17-
-`Peek2` now accepts the more general`BoundedBifunctor`
18-
-`Identity`,`Compose`, and`Const` functors all have better`toString` implementations
19-
-`Into3-8` now supports functions with parameter variance
20-
-`HListLens#tail` is now covariant in`Tail` parameter
21-
2223
###Deprecated
2324
-`Either#trying` in favor of`Try#trying`
2425

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

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,16 @@
2323
* @param <A> the Traversable element type
2424
* @param <App> the Applicative unification parameter
2525
* @param <Trav> the Traversable unification parameter
26+
* @param <AppA> the Applicative instance wrapped in the input Traversable
27+
* @param <TravA> the Traversable instance wrapped in the output Applicative
2628
* @param <AppTrav> the concrete parametrized output Applicative type
2729
* @param <TravApp> the concrete parametrized input Traversable type
2830
*/
29-
publicfinalclassSequence<A,AppextendsApplicative,TravextendsTraversable,AppTravextendsApplicative<?extendsTraversable<A,Trav>,App>,
30-
TravAppextendsTraversable<?extendsApplicative<A,App>,Trav>>implementsFn2<TravApp,Function<?superTraversable<A,Trav>, ?extendsAppTrav>,AppTrav> {
31+
publicfinalclassSequence<A,AppextendsApplicative,TravextendsTraversable,
32+
AppAextendsApplicative<A,App>,
33+
TravAextendsTraversable<A,Trav>,
34+
AppTravextendsApplicative<TravA,App>,
35+
TravAppextendsTraversable<AppA,Trav>>implementsFn2<TravApp,Function<TravA, ?extendsAppTrav>,AppTrav> {
3136

3237
privatestaticfinalSequenceINSTANCE =newSequence();
3338

@@ -36,43 +41,47 @@ private Sequence() {
3641

3742
@Override
3843
@SuppressWarnings("unchecked")
39-
publicAppTravapply(TravApptraversable,Function<?superTraversable<A,Trav>, ?extendsAppTrav>pure) {
40-
return (AppTrav)traversable.traverse(id(),pure);
44+
publicAppTravapply(TravApptraversable,Function<TravA, ?extendsAppTrav>pure) {
45+
return (AppTrav)traversable.traverse(id(),trav ->pure.apply((TravA)trav));
4146
}
4247

4348
@SuppressWarnings("unchecked")
4449
publicstatic <A,AppextendsApplicative,TravextendsTraversable,
45-
AppTravextendsApplicative<?extendsTraversable<A,Trav>,App>,
46-
TravAppextendsTraversable<?extendsApplicative<A,App>,Trav>>Sequence<A,App,Trav,AppTrav,TravApp>sequence() {
50+
AppAextendsApplicative<A,App>,
51+
TravAextendsTraversable<A,Trav>,
52+
AppTravextendsApplicative<TravA,App>,
53+
TravAppextendsTraversable<AppA,Trav>>Sequence<A,App,Trav,AppA,TravA,AppTrav,TravApp>sequence() {
4754
returnINSTANCE;
4855
}
4956

5057
publicstatic <A,AppextendsApplicative,TravextendsTraversable,
51-
AppTravextendsApplicative<?extendsTraversable<A,Trav>,App>,
52-
TravAppextendsTraversable<?extendsApplicative<A,App>,Trav>>Fn1<Function<?superTraversable<A,Trav>, ?extendsAppTrav>,AppTrav>sequence(
58+
AppAextendsApplicative<A,App>,
59+
TravAextendsTraversable<A,Trav>,
60+
AppTravextendsApplicative<TravA,App>,
61+
TravAppextendsTraversable<AppA,Trav>>Fn1<Function<TravA, ?extendsAppTrav>,AppTrav>sequence(
5362
TravApptraversable) {
54-
returnSequence.<A,App,Trav,AppTrav,TravApp>sequence().apply(traversable);
63+
returnSequence.<A,App,Trav,AppA,TravA,AppTrav,TravApp>sequence().apply(traversable);
5564
}
5665

5766
publicstatic <A,AppextendsApplicative,TravextendsTraversable,
58-
AppTravextendsApplicative<?extendsTraversable<A,Trav>,App>,
59-
TravAppextendsTraversable<?extendsApplicative<A,App>,Trav>>AppTravsequence(TravApptraversable,
60-
Function<?superTraversable<A,Trav>, ?extendsAppTrav>pure) {
61-
returnSequence.<A,App,Trav,AppTrav,TravApp>sequence(traversable).apply(pure);
67+
TravAextendsTraversable<A,Trav>,
68+
AppAextendsApplicative<A,App>,
69+
AppTravextendsApplicative<TravA,App>,
70+
TravAppextendsTraversable<AppA,Trav>>AppTravsequence(TravApptraversable,
71+
Function<TravA, ?extendsAppTrav>pure) {
72+
returnSequence.<A,App,Trav,AppA,TravA,AppTrav,TravApp>sequence(traversable).apply(pure);
6273
}
6374

64-
@SuppressWarnings("unchecked")
65-
publicstatic <A,AppextendsApplicative,AppIterableextendsApplicative<Iterable<A>,App>,IterableAppextendsIterable<?extendsApplicative<A,App>>>Fn1<Function<?superIterable<A>, ?extendsAppIterable>,AppIterable>sequence(
66-
IterableAppiterableApp) {
67-
returnpure ->
68-
(AppIterable)sequence(LambdaIterable.wrap(iterableApp),x ->pure.apply(((LambdaIterable<A>)x).unwrap())
69-
.fmap(LambdaIterable::wrap))
70-
.fmap(LambdaIterable::unwrap);
75+
@SuppressWarnings({"unchecked","RedundantTypeArguments"})
76+
publicstatic <A,AppextendsApplicative,AppAextendsApplicative<A,App>,AppIterableextendsApplicative<Iterable<A>,App>,IterableAppextendsIterable<AppA>>
77+
Fn1<Function<Iterable<A>, ?extendsAppIterable>,AppIterable>sequence(IterableAppiterableApp) {
78+
returnpure -> (AppIterable)Sequence.<A,App,LambdaIterable,LambdaIterable<A>,AppA,Applicative<LambdaIterable<A>,App>,LambdaIterable<AppA>>sequence(
79+
LambdaIterable.wrap(iterableApp),x ->pure.apply(x.unwrap()).fmap(LambdaIterable::wrap))
80+
.fmap(LambdaIterable::unwrap);
7181
}
7282

73-
publicstatic <A,AppextendsApplicative,AppIterableextendsApplicative<Iterable<A>,App>,
74-
IterableAppextendsIterable<?extendsApplicative<A,App>>>AppIterablesequence(IterableAppiterableApp,
75-
Function<?superIterable<A>, ?extendsAppIterable>pure) {
76-
returnSequence.<A,App,AppIterable,IterableApp>sequence(iterableApp).apply(pure);
83+
publicstatic <A,AppextendsApplicative,AppAextendsApplicative<A,App>,AppIterableextendsApplicative<Iterable<A>,App>,IterableAppextendsIterable<AppA>>
84+
AppIterablesequence(IterableAppiterableApp,Function<Iterable<A>, ?extendsAppIterable>pure) {
85+
returnSequence.<A,App,AppA,AppIterable,IterableApp>sequence(iterableApp).apply(pure);
7786
}
7887
}

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

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
packagecom.jnape.palatable.lambda.functions.builtin.fn2;
22

33
importcom.jnape.palatable.lambda.adt.Either;
4+
importcom.jnape.palatable.lambda.adt.Maybe;
45
importcom.jnape.palatable.lambda.functor.builtin.Compose;
56
importcom.jnape.palatable.lambda.functor.builtin.Identity;
67
importorg.junit.Test;
78

89
importjava.util.function.Function;
910

1011
importstaticcom.jnape.palatable.lambda.adt.Either.right;
12+
importstaticcom.jnape.palatable.lambda.adt.Maybe.just;
1113
importstaticcom.jnape.palatable.lambda.functions.builtin.fn1.Id.id;
1214
importstaticcom.jnape.palatable.lambda.functions.builtin.fn2.Sequence.sequence;
1315
importstaticjava.util.Arrays.asList;
@@ -29,15 +31,15 @@ public void naturality() {
2931
@Test
3032
publicvoididentity() {
3133
Either<String,Identity<Integer>>traversable =right(newIdentity<>(1));
32-
assertEquals(sequence(traversable.fmap(Identity::new),Identity::new),
33-
newIdentity<>(traversable));
34+
assertEquals(newIdentity<>(traversable),
35+
sequence(traversable.fmap(Identity::new),Identity::new));
3436
}
3537

3638
@Test
3739
publicvoidcomposition() {
3840
Either<String,Identity<Either<String,Integer>>>traversable =right(newIdentity<>(right(1)));
39-
assertEquals(sequence(traversable.fmap(x ->newCompose<>(x.fmap(id()))),x ->newCompose<>(newIdentity<>(right(x)))),
40-
newCompose<>(sequence(traversable,Identity::new).fmap(x ->sequence(x,Either::right)).fmap(id())));
41+
assertEquals(newCompose<>(sequence(traversable,Identity::new).fmap(x ->sequence(x,Either::right)).fmap(id())),
42+
sequence(traversable.fmap(x ->newCompose<>(x.fmap(id()))),x ->newCompose<>(newIdentity<>(right(x)))));
4143
}
4244

4345
@Test
@@ -46,4 +48,19 @@ public void iterableSpecialization() {
4648
.orThrow(l ->newAssertionError("Expected a right value, but was a left value of <" +l +">")),
4749
iterates(1,2));
4850
}
51+
52+
@Test
53+
publicvoidcompilation() {
54+
Either<String,Maybe<Integer>>a =sequence(just(right(1)),Either::right);
55+
assertEquals(right(just(1)),a);
56+
57+
Maybe<Either<String,Integer>>b =sequence(right(just(1)),Maybe::just);
58+
assertEquals(just(right(1)),b);
59+
60+
Either<String,Maybe<Integer>>c =sequence(b,Either::right);
61+
assertEquals(a,c);
62+
63+
Maybe<Iterable<Integer>>d =sequence(asList(just(1),just(2)),Maybe::just);
64+
assertThat(d.orElseThrow(AssertionError::new),iterates(1,2));
65+
}
4966
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp