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- 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 > {
3136
3237 private static final Sequence INSTANCE = new Sequence ();
3338
@@ -36,43 +41,47 @@ private Sequence() {
3641
3742 @ Override
3843 @ 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 ) );
4146 }
4247
4348 @ SuppressWarnings ("unchecked" )
4449 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 () {
4754 return INSTANCE ;
4855 }
4956
5057 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 (
5362 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 );
5564 }
5665
5766 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 );
6273 }
6374
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 );
7181 }
7282
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 );
7786 }
7887}
0 commit comments