23
23
* @param <A> the Traversable element type
24
24
* @param <App> the Applicative unification parameter
25
25
* @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
26
28
* @param <AppTrav> the concrete parametrized output Applicative type
27
29
* @param <TravApp> the concrete parametrized input Traversable type
28
30
*/
29
- public final class Sequence <A , App extends Applicative , Trav extends Traversable , AppTrav extends Applicative <? extends Traversable <A , Trav >, App >,
30
- TravApp extends Traversable <? extends Applicative <A , App >, Trav >> implements Fn2 <TravApp , Function <? super Traversable <A , Trav >, ? extends AppTrav >, AppTrav > {
31
+ public final class Sequence <A , App extends Applicative , Trav extends Traversable ,
32
+ AppA extends Applicative <A , App >,
33
+ TravA extends Traversable <A , Trav >,
34
+ AppTrav extends Applicative <TravA , App >,
35
+ TravApp extends Traversable <AppA , Trav >> implements Fn2 <TravApp , Function <TravA , ? extends AppTrav >, AppTrav > {
31
36
32
37
private static final Sequence INSTANCE = new Sequence ();
33
38
@@ -36,43 +41,47 @@ private Sequence() {
36
41
37
42
@ Override
38
43
@ SuppressWarnings ("unchecked" )
39
- public AppTrav apply (TravApp traversable , Function <? super Traversable < A , Trav > , ? extends AppTrav > pure ) {
40
- return (AppTrav ) traversable .traverse (id (), pure );
44
+ public AppTrav apply (TravApp traversable , Function <TravA , ? extends AppTrav > pure ) {
45
+ return (AppTrav ) traversable .traverse (id (), trav -> pure . apply (( TravA ) trav ) );
41
46
}
42
47
43
48
@ SuppressWarnings ("unchecked" )
44
49
public static <A , App extends Applicative , Trav extends Traversable ,
45
- AppTrav extends Applicative <? extends Traversable <A , Trav >, App >,
46
- TravApp extends Traversable <? extends Applicative <A , App >, Trav >> Sequence <A , App , Trav , AppTrav , TravApp > sequence () {
50
+ AppA extends Applicative <A , App >,
51
+ 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 () {
47
54
return INSTANCE ;
48
55
}
49
56
50
57
public static <A , App extends Applicative , Trav extends Traversable ,
51
- AppTrav extends Applicative <? extends Traversable <A , Trav >, App >,
52
- TravApp extends Traversable <? extends Applicative <A , App >, Trav >> Fn1 <Function <? super Traversable <A , Trav >, ? extends AppTrav >, AppTrav > sequence (
58
+ AppA extends Applicative <A , App >,
59
+ TravA extends Traversable <A , Trav >,
60
+ AppTrav extends Applicative <TravA , App >,
61
+ TravApp extends Traversable <AppA , Trav >> Fn1 <Function <TravA , ? extends AppTrav >, AppTrav > sequence (
53
62
TravApp traversable ) {
54
- return Sequence .<A , App , Trav , AppTrav , TravApp >sequence ().apply (traversable );
63
+ return Sequence .<A , App , Trav , AppA , TravA , AppTrav , TravApp >sequence ().apply (traversable );
55
64
}
56
65
57
66
public static <A , App extends Applicative , Trav extends Traversable ,
58
- AppTrav extends Applicative <? extends Traversable <A , Trav >, App >,
59
- TravApp extends Traversable <? extends Applicative <A , App >, Trav >> AppTrav sequence (TravApp traversable ,
60
- Function <? super Traversable <A , Trav >, ? extends AppTrav > pure ) {
61
- return Sequence .<A , App , Trav , AppTrav , TravApp >sequence (traversable ).apply (pure );
67
+ 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
+ Function <TravA , ? extends AppTrav > pure ) {
72
+ return Sequence .<A , App , Trav , AppA , TravA , AppTrav , TravApp >sequence (traversable ).apply (pure );
62
73
}
63
74
64
- @ SuppressWarnings ("unchecked" )
65
- public static <A , App extends Applicative , AppIterable extends Applicative <Iterable <A >, App >, IterableApp extends Iterable <? extends Applicative <A , App >>> Fn1 <Function <? super Iterable <A >, ? extends AppIterable >, AppIterable > sequence (
66
- IterableApp iterableApp ) {
67
- return pure ->
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
+ public static <A , App extends Applicative , AppA extends Applicative <A , App >, AppIterable extends Applicative <Iterable <A >, App >, IterableApp extends Iterable <AppA >>
77
+ Fn1 <Function <Iterable <A >, ? extends AppIterable >, AppIterable > sequence (IterableApp iterableApp ) {
78
+ return pure -> (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 );
71
81
}
72
82
73
- public static <A , App extends Applicative , AppIterable extends Applicative <Iterable <A >, App >,
74
- IterableApp extends Iterable <? extends Applicative <A , App >>> AppIterable sequence (IterableApp iterableApp ,
75
- Function <? super Iterable <A >, ? extends AppIterable > pure ) {
76
- return Sequence .<A , App , AppIterable , IterableApp >sequence (iterableApp ).apply (pure );
83
+ public static <A , App extends Applicative , AppA extends Applicative <A , App >, AppIterable extends Applicative <Iterable <A >, App >, IterableApp extends Iterable <AppA >>
84
+ AppIterable sequence (IterableApp iterableApp , Function <Iterable <A >, ? extends AppIterable > pure ) {
85
+ return Sequence .<A , App , AppA , AppIterable , IterableApp >sequence (iterableApp ).apply (pure );
77
86
}
78
87
}
0 commit comments