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