10
10
import com .jnape .palatable .lambda .monad .MonadRec ;
11
11
import com .jnape .palatable .lambda .monad .transformer .builtin .*;
12
12
import com .jnape .palatable .lambda .monad .transformer .interpreter .interpreters .Transformers ;
13
+ import com .jnape .palatable .lambda .monoid .Monoid ;
13
14
14
15
import static com .jnape .palatable .lambda .adt .Either .left ;
15
16
import static com .jnape .palatable .lambda .adt .Either .right ;
24
25
import static com .jnape .palatable .lambda .monad .transformer .interpreter .InterpreterH .lifting ;
25
26
import static com .jnape .palatable .lambda .monad .transformer .interpreter .interpreters .Transformers .*;
26
27
import static com .jnape .palatable .lambda .monad .transformer .interpreter .interpreters .transformers .Construction .eitherT ;
28
+ import static com .jnape .palatable .lambda .monoid .Monoid .monoid ;
27
29
28
30
public class Example {
29
31
public static void simpleCase () {
@@ -68,7 +70,7 @@ public static void deeplyNested() {
68
70
Interpreter <EitherT <MaybeT <IdentityT <IO <?>, ?>, ?>, String , ?>, Integer , IO <?>, Integer > interpreter =
69
71
Transformers .<MaybeT <IdentityT <IO <?>, ?>, ?>, String , Integer >interpretEitherT (recoveryFn )
70
72
.andThen (interpretMaybeT (orElseGet ))
71
- .andThenH (interpretIdentityT ());
73
+ .andThen (interpretIdentityT ());
72
74
73
75
interpreter
74
76
.<IO <Integer >>interpret (eitherT (maybeT (identityT (io (() -> new Identity <>(just (right (42 ))))))))
@@ -85,11 +87,12 @@ public static void readerTCase() {
85
87
// F a
86
88
ReaderT <Boolean , EitherT <IO <?>, String , ?>, ?>, Integer ,
87
89
// G b
88
- IO <?>, Tuple2 <Either <String , Integer >, Integer >
90
+ IO <?>, Tuple2 <Either <String , Integer >, Integer >
89
91
> massiveInterpreter =
90
- Transformers .<Boolean , EitherT <IO <?>, String , ?>>runReaderT (true )
92
+ Transformers
93
+ .<Boolean , EitherT <IO <?>, String , ?>>runReaderT (true )
91
94
.<IO <?>, Integer , Either <String , Integer >>andThen (runEitherT ())
92
- .<StateT <Integer , IO <?>, ?>>andThenH (lifting (liftStateT ()))
95
+ .<StateT <Integer , IO <?>, ?>>andThen (lifting (liftStateT ()))
93
96
.andThen (eitherT ())
94
97
.andThen (runEitherT ())
95
98
.andThen (runStateT (10 ));
@@ -105,5 +108,33 @@ public static void main(String[] args) {
105
108
nested ();
106
109
deeplyNested ();
107
110
readerTCase ();
111
+ iterateTCase ();
112
+ }
113
+
114
+ public static <M extends MonadRec <?, M >, A > Interpreter <IterateT <M , ?>, A , M , A > folding (Monoid <A > monoid ) {
115
+ return new Interpreter <IterateT <M , ?>, A , M , A >() {
116
+ @ Override
117
+ public <GB extends MonadRec <A , M >> GB interpret (MonadRec <A , IterateT <M , ?>> fa ) {
118
+ IterateT <M , A > ma = fa .coerce ();
119
+ MonadRec <Maybe <Tuple2 <A , IterateT <M , A >>>, M > mmta = ma .runIterateT ();
120
+ return ma .fold ((a , b ) -> mmta .pure (monoid .apply (a , b )),
121
+ mmta .pure (monoid .identity ()));
122
+ }
123
+ };
124
+ }
125
+
126
+ public static <M extends MonadRec <?, M >, A > Interpreter <IterateT <M , ?>, A , M , Maybe <A >> head () {
127
+ return new Interpreter <IterateT <M , ?>, A , M , Maybe <A >>() {
128
+ @ Override
129
+ public <GB extends MonadRec <Maybe <A >, M >> GB interpret (MonadRec <A , IterateT <M , ?>> fa ) {
130
+ return fa .<IterateT <M , A >>coerce ().runIterateT ().fmap (m -> m .fmap (Tuple2 ::_1 )).coerce ();
131
+ }
132
+ };
133
+ }
134
+
135
+ private static void iterateTCase () {
136
+ Interpreter <ReaderT <Boolean , IterateT <IO <?>, ?>, ?>, Integer , IO <?>, Integer > whoa =
137
+ Example .<IO <?>, Integer >folding (monoid (Integer ::sum , 0 ))
138
+ .compose (runReaderT (true ));
108
139
}
109
140
}
0 commit comments