@@ -34,9 +34,11 @@ public final class WriterT<W, M extends MonadRec<?, M>, A> implements
34
34
MonadWriter <W , A , WriterT <W , M , ?>>,
35
35
MonadT <M , A , WriterT <W , M , ?>, WriterT <W , ?, ?>> {
36
36
37
+ private final Pure <M > pureM ;
37
38
private final Fn1 <? super Monoid <W >, ? extends MonadRec <Tuple2 <A , W >, M >> writerFn ;
38
39
39
- private WriterT (Fn1 <? super Monoid <W >, ? extends MonadRec <Tuple2 <A , W >, M >> writerFn ) {
40
+ private WriterT (Pure <M > pureM , Fn1 <? super Monoid <W >, ? extends MonadRec <Tuple2 <A , W >, M >> writerFn ) {
41
+ this .pureM = pureM ;
40
42
this .writerFn = writerFn ;
41
43
}
42
44
@@ -82,15 +84,15 @@ public <MW extends MonadRec<W, M>> MW execWriterT(Monoid<W> monoid) {
82
84
*/
83
85
@ Override
84
86
public <B > WriterT <W , M , Tuple2 <A , B >> listens (Fn1 <? super W , ? extends B > fn ) {
85
- return new WriterT <>(writerFn .fmap (m -> m .fmap (into ((a , w ) -> both (both (constantly (a ), fn ), id (), w )))));
87
+ return new WriterT <>(pureM , writerFn .fmap (m -> m .fmap (into ((a , w ) -> both (both (constantly (a ), fn ), id (), w )))));
86
88
}
87
89
88
90
/**
89
91
* {@inheritDoc}
90
92
*/
91
93
@ Override
92
94
public WriterT <W , M , A > censor (Fn1 <? super W , ? extends W > fn ) {
93
- return new WriterT <>(writerFn .fmap (mt -> mt .fmap (t -> t .fmap (fn ))));
95
+ return new WriterT <>(pureM , writerFn .fmap (mt -> mt .fmap (t -> t .fmap (fn ))));
94
96
}
95
97
96
98
/**
@@ -107,7 +109,7 @@ public <B, N extends MonadRec<?, N>> WriterT<W, N, B> lift(MonadRec<B, N> mb) {
107
109
@ Override
108
110
public <B > WriterT <W , M , B > trampolineM (
109
111
Fn1 <? super A , ? extends MonadRec <RecursiveResult <A , B >, WriterT <W , M , ?>>> fn ) {
110
- return new WriterT <>(monoid -> runWriterT (monoid ).trampolineM (into ((a , w ) -> fn .apply (a )
112
+ return new WriterT <>(pureM , monoid -> runWriterT (monoid ).trampolineM (into ((a , w ) -> fn .apply (a )
111
113
.<WriterT <W , M , RecursiveResult <A , B >>>coerce ()
112
114
.runWriterT (monoid ).fmap (t -> t .fmap (monoid .apply (w )))
113
115
.fmap (into ((aOrB , w_ ) -> aOrB .biMap (a_ -> tuple (a_ , w_ ), b -> tuple (b , w_ )))))));
@@ -126,15 +128,15 @@ public <B> WriterT<W, M, B> fmap(Fn1<? super A, ? extends B> fn) {
126
128
*/
127
129
@ Override
128
130
public <B > WriterT <W , M , B > pure (B b ) {
129
- return new WriterT <>(m -> runWriterT ( m ). pure (tuple (b , m .identity ())));
131
+ return new WriterT <>(pureM , m -> pureM . apply (tuple (b , m .identity ())));
130
132
}
131
133
132
134
/**
133
135
* {@inheritDoc}
134
136
*/
135
137
@ Override
136
138
public <B > WriterT <W , M , B > flatMap (Fn1 <? super A , ? extends Monad <B , WriterT <W , M , ?>>> f ) {
137
- return new WriterT <>(monoid -> writerFn .apply (monoid )
139
+ return new WriterT <>(pureM , monoid -> writerFn .apply (monoid )
138
140
.flatMap (into ((a , w ) -> f .apply (a ).<WriterT <W , M , B >>coerce ().runWriterT (monoid )
139
141
.fmap (t -> t .fmap (monoid .apply (w ))))));
140
142
}
@@ -144,7 +146,7 @@ public <B> WriterT<W, M, B> flatMap(Fn1<? super A, ? extends Monad<B, WriterT<W,
144
146
*/
145
147
@ Override
146
148
public <B > WriterT <W , M , B > zip (Applicative <Fn1 <? super A , ? extends B >, WriterT <W , M , ?>> appFn ) {
147
- return new WriterT <>(monoid -> runWriterT (monoid )
149
+ return new WriterT <>(pureM , monoid -> runWriterT (monoid )
148
150
.zip (appFn .<WriterT <W , M , Fn1 <? super A , ? extends B >>>coerce ().runWriterT (monoid )
149
151
.fmap (into ((f , y ) -> into ((a , x ) -> tuple (f .apply (a ), monoid .apply (x , y )))))));
150
152
}
@@ -196,7 +198,7 @@ public static <W, M extends MonadRec<?, M>> WriterT<W, M, Unit> tell(MonadRec<W,
196
198
* @return the {@link WriterT}
197
199
*/
198
200
public static <W , M extends MonadRec <?, M >, A > WriterT <W , M , A > listen (MonadRec <A , M > ma ) {
199
- return new WriterT <>(monoid -> ma .fmap (a -> tuple (a , monoid .identity ())));
201
+ return new WriterT <>(Pure . of ( ma ), monoid -> ma .fmap (a -> tuple (a , monoid .identity ())));
200
202
}
201
203
202
204
/**
@@ -209,7 +211,7 @@ public static <W, M extends MonadRec<?, M>, A> WriterT<W, M, A> listen(MonadRec<
209
211
* @return the {@link WriterT}
210
212
*/
211
213
public static <W , M extends MonadRec <?, M >, A > WriterT <W , M , A > writerT (MonadRec <Tuple2 <A , W >, M > maw ) {
212
- return new WriterT <>(constantly (maw ));
214
+ return new WriterT <>(Pure . of ( maw ), constantly (maw ));
213
215
}
214
216
215
217
/**
0 commit comments