Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c24e129

Browse files
committed
more examples
1 parent e50aec0 commit c24e129

File tree

3 files changed

+39
-8
lines changed

3 files changed

+39
-8
lines changed

src/main/java/com/jnape/palatable/lambda/monad/transformer/interpreter/Example.java

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.jnape.palatable.lambda.monad.MonadRec;
1111
import com.jnape.palatable.lambda.monad.transformer.builtin.*;
1212
import com.jnape.palatable.lambda.monad.transformer.interpreter.interpreters.Transformers;
13+
import com.jnape.palatable.lambda.monoid.Monoid;
1314

1415
import static com.jnape.palatable.lambda.adt.Either.left;
1516
import static com.jnape.palatable.lambda.adt.Either.right;
@@ -24,6 +25,7 @@
2425
import static com.jnape.palatable.lambda.monad.transformer.interpreter.InterpreterH.lifting;
2526
import static com.jnape.palatable.lambda.monad.transformer.interpreter.interpreters.Transformers.*;
2627
import static com.jnape.palatable.lambda.monad.transformer.interpreter.interpreters.transformers.Construction.eitherT;
28+
import static com.jnape.palatable.lambda.monoid.Monoid.monoid;
2729

2830
public class Example {
2931
public static void simpleCase() {
@@ -68,7 +70,7 @@ public static void deeplyNested() {
6870
Interpreter<EitherT<MaybeT<IdentityT<IO<?>, ?>, ?>, String, ?>, Integer, IO<?>, Integer> interpreter =
6971
Transformers.<MaybeT<IdentityT<IO<?>, ?>, ?>, String, Integer>interpretEitherT(recoveryFn)
7072
.andThen(interpretMaybeT(orElseGet))
71-
.andThenH(interpretIdentityT());
73+
.andThen(interpretIdentityT());
7274

7375
interpreter
7476
.<IO<Integer>>interpret(eitherT(maybeT(identityT(io(() -> new Identity<>(just(right(42))))))))
@@ -85,11 +87,12 @@ public static void readerTCase() {
8587
// F a
8688
ReaderT<Boolean, EitherT<IO<?>, String, ?>, ?>, Integer,
8789
// G b
88-
IO<?>, Tuple2<Either<String, Integer>, Integer>
90+
IO<?>, Tuple2<Either<String, Integer>, Integer>
8991
> massiveInterpreter =
90-
Transformers.<Boolean, EitherT<IO<?>, String, ?>>runReaderT(true)
92+
Transformers
93+
.<Boolean, EitherT<IO<?>, String, ?>>runReaderT(true)
9194
.<IO<?>, Integer, Either<String, Integer>>andThen(runEitherT())
92-
.<StateT<Integer, IO<?>, ?>>andThenH(lifting(liftStateT()))
95+
.<StateT<Integer, IO<?>, ?>>andThen(lifting(liftStateT()))
9396
.andThen(eitherT())
9497
.andThen(runEitherT())
9598
.andThen(runStateT(10));
@@ -105,5 +108,33 @@ public static void main(String[] args) {
105108
nested();
106109
deeplyNested();
107110
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));
108139
}
109140
}

src/main/java/com/jnape/palatable/lambda/monad/transformer/interpreter/Interpreter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public <HC extends MonadRec<C, H>> HC interpret(MonadRec<A, F> fa) {
1717
};
1818
}
1919

20-
default <H extends MonadRec<?, H>> Interpreter<F, A, H, B> andThenH(InterpreterH<G, H> gh) {
20+
default <H extends MonadRec<?, H>> Interpreter<F, A, H, B> andThen(InterpreterH<G, H> gh) {
2121
return new Interpreter<F, A, H, B>() {
2222
@Override
2323
public <GB extends MonadRec<B, H>> GB interpret(MonadRec<A, F> fa) {
@@ -30,7 +30,7 @@ default <E extends MonadRec<?, E>, Z> Interpreter<E, Z, G, B> compose(Interprete
3030
return efza.andThen(this);
3131
}
3232

33-
default <E extends MonadRec<?, E>> Interpreter<E, A, G, B> composeH(InterpreterH<E, F> ef) {
33+
default <E extends MonadRec<?, E>> Interpreter<E, A, G, B> compose(InterpreterH<E, F> ef) {
3434
return new Interpreter<E, A, G, B>() {
3535
@Override
3636
public <GB extends MonadRec<B, G>> GB interpret(MonadRec<A, E> ea) {

src/main/java/com/jnape/palatable/lambda/monad/transformer/interpreter/InterpreterH.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,15 @@ public <A, HA extends MonadRec<A, H>> HA interpretH(MonadRec<A, F> fa) {
2020
}
2121

2222
default <H extends MonadRec<?, H>, A, B> Interpreter<F, A, H, B> andThen(Interpreter<G, A, H, B> gh) {
23-
return gh.composeH(this);
23+
return gh.compose(this);
2424
}
2525

2626
default <E extends MonadRec<?, E>> InterpreterH<E, G> composeH(InterpreterH<E, F> ef) {
2727
return ef.andThenH(this);
2828
}
2929

3030
default <E extends MonadRec<?, E>, A, B> Interpreter<E, A, G, B> compose(Interpreter<E, A, F, B> gh) {
31-
return gh.andThenH(this);
31+
return gh.andThen(this);
3232
}
3333

3434
default <A> Interpreter<F, A, G, A> monomorphize() {

0 commit comments

Comments
 (0)