Skip to content

Commit 27879e8

Browse files
nomicfluxjnape
authored andcommitted
Add BimonadRec for instances of both MonadRec and Comonad
- Prevent type inference explosions with too many extensions on Tuples
1 parent ed6a066 commit 27879e8

21 files changed

+258
-152
lines changed

src/main/java/com/jnape/palatable/lambda/adt/hlist/SingletonHList.java

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import com.jnape.palatable.lambda.adt.hlist.HList.HCons;
44
import com.jnape.palatable.lambda.adt.hlist.HList.HNil;
5+
import com.jnape.palatable.lambda.bimonad.BimonadRec;
6+
import com.jnape.palatable.lambda.comonad.Comonad;
57
import com.jnape.palatable.lambda.functions.Fn1;
68
import com.jnape.palatable.lambda.functions.recursion.RecursiveResult;
79
import com.jnape.palatable.lambda.functions.specialized.Pure;
@@ -24,7 +26,7 @@
2426
* @see Tuple5
2527
*/
2628
public class SingletonHList<_1> extends HCons<_1, HNil> implements
27-
MonadRec<_1, SingletonHList<?>>,
29+
BimonadRec<_1, SingletonHList<?>>,
2830
Traversable<_1, SingletonHList<?>> {
2931

3032
SingletonHList(_1 _1) {
@@ -51,12 +53,28 @@ public <_2> Tuple2<_1, _2> snoc(_2 _2) {
5153
return tuple(head(), _2);
5254
}
5355

56+
/**
57+
* {@inheritDoc}
58+
*/
59+
@Override
60+
public _1 extract() {
61+
return head();
62+
}
63+
64+
/**
65+
* {@inheritDoc}
66+
*/
67+
@Override
68+
public <B> SingletonHList<B> extendImpl(Fn1<? super Comonad<_1, SingletonHList<?>>, ? extends B> f) {
69+
return singletonHList(f.apply(this));
70+
}
71+
5472
/**
5573
* {@inheritDoc}
5674
*/
5775
@Override
5876
public <_1Prime> SingletonHList<_1Prime> fmap(Fn1<? super _1, ? extends _1Prime> fn) {
59-
return MonadRec.super.<_1Prime>fmap(fn).coerce();
77+
return BimonadRec.super.<_1Prime>fmap(fn).coerce();
6078
}
6179

6280
/**
@@ -73,7 +91,7 @@ public <_1Prime> SingletonHList<_1Prime> pure(_1Prime _1Prime) {
7391
@Override
7492
public <_1Prime> SingletonHList<_1Prime> zip(
7593
Applicative<Fn1<? super _1, ? extends _1Prime>, SingletonHList<?>> appFn) {
76-
return MonadRec.super.zip(appFn).coerce();
94+
return BimonadRec.super.zip(appFn).coerce();
7795
}
7896

7997
/**
@@ -82,23 +100,23 @@ public <_1Prime> SingletonHList<_1Prime> zip(
82100
@Override
83101
public <_1Prime> Lazy<SingletonHList<_1Prime>> lazyZip(
84102
Lazy<? extends Applicative<Fn1<? super _1, ? extends _1Prime>, SingletonHList<?>>> lazyAppFn) {
85-
return MonadRec.super.lazyZip(lazyAppFn).fmap(Monad<_1Prime, SingletonHList<?>>::coerce);
103+
return BimonadRec.super.lazyZip(lazyAppFn).fmap(Monad<_1Prime, SingletonHList<?>>::coerce);
86104
}
87105

88106
/**
89107
* {@inheritDoc}
90108
*/
91109
@Override
92110
public <_1Prime> SingletonHList<_1Prime> discardL(Applicative<_1Prime, SingletonHList<?>> appB) {
93-
return MonadRec.super.discardL(appB).coerce();
111+
return BimonadRec.super.discardL(appB).coerce();
94112
}
95113

96114
/**
97115
* {@inheritDoc}
98116
*/
99117
@Override
100118
public <_1Prime> SingletonHList<_1> discardR(Applicative<_1Prime, SingletonHList<?>> appB) {
101-
return MonadRec.super.discardR(appB).coerce();
119+
return BimonadRec.super.discardR(appB).coerce();
102120
}
103121

104122
/**

src/main/java/com/jnape/palatable/lambda/adt/hlist/Tuple2.java

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import com.jnape.palatable.lambda.adt.Maybe;
44
import com.jnape.palatable.lambda.adt.hlist.HList.HCons;
55
import com.jnape.palatable.lambda.adt.product.Product2;
6+
import com.jnape.palatable.lambda.bimonad.BimonadRec;
7+
import com.jnape.palatable.lambda.comonad.Comonad;
68
import com.jnape.palatable.lambda.functions.Fn1;
79
import com.jnape.palatable.lambda.functions.builtin.fn1.Head;
810
import com.jnape.palatable.lambda.functions.recursion.RecursiveResult;
@@ -37,7 +39,7 @@
3739
*/
3840
public class Tuple2<_1, _2> extends HCons<_1, SingletonHList<_2>> implements
3941
Product2<_1, _2>,
40-
MonadRec<_2, Tuple2<_1, ?>>,
42+
BimonadRec<_2, Tuple2<_1, ?>>,
4143
MonadWriter<_1, _2, Tuple2<_1, ?>>,
4244
Bifunctor<_1, _2, Tuple2<?, ?>>,
4345
Traversable<_2, Tuple2<_1, ?>> {
@@ -134,12 +136,28 @@ public Tuple2<_2, _1> invert() {
134136
return tuple(_2, _1);
135137
}
136138

139+
/**
140+
* {@inheritDoc}
141+
*/
142+
@Override
143+
public _2 extract() {
144+
return _2;
145+
}
146+
147+
/**
148+
* {@inheritDoc}
149+
*/
150+
@Override
151+
public <B> Tuple2<_1, B> extendImpl(Fn1<? super Comonad<_2, Tuple2<_1, ?>>, ? extends B> f) {
152+
return tuple(_1, f.apply(this));
153+
}
154+
137155
/**
138156
* {@inheritDoc}
139157
*/
140158
@Override
141159
public <_2Prime> Tuple2<_1, _2Prime> fmap(Fn1<? super _2, ? extends _2Prime> fn) {
142-
return MonadRec.super.<_2Prime>fmap(fn).coerce();
160+
return BimonadRec.super.<_2Prime>fmap(fn).coerce();
143161
}
144162

145163
/**
@@ -181,7 +199,7 @@ public <_2Prime> Tuple2<_1, _2Prime> pure(_2Prime _2Prime) {
181199
@Override
182200
public <_2Prime> Tuple2<_1, _2Prime> zip(
183201
Applicative<Fn1<? super _2, ? extends _2Prime>, Tuple2<_1, ?>> appFn) {
184-
return MonadRec.super.zip(appFn).coerce();
202+
return BimonadRec.super.zip(appFn).coerce();
185203
}
186204

187205
/**
@@ -190,23 +208,23 @@ public <_2Prime> Tuple2<_1, _2Prime> zip(
190208
@Override
191209
public <_2Prime> Lazy<Tuple2<_1, _2Prime>> lazyZip(
192210
Lazy<? extends Applicative<Fn1<? super _2, ? extends _2Prime>, Tuple2<_1, ?>>> lazyAppFn) {
193-
return MonadRec.super.lazyZip(lazyAppFn).fmap(Monad<_2Prime, Tuple2<_1, ?>>::coerce);
211+
return BimonadRec.super.lazyZip(lazyAppFn).fmap(Monad<_2Prime, Tuple2<_1, ?>>::coerce);
194212
}
195213

196214
/**
197215
* {@inheritDoc}
198216
*/
199217
@Override
200218
public <_2Prime> Tuple2<_1, _2Prime> discardL(Applicative<_2Prime, Tuple2<_1, ?>> appB) {
201-
return MonadRec.super.discardL(appB).coerce();
219+
return BimonadRec.super.discardL(appB).coerce();
202220
}
203221

204222
/**
205223
* {@inheritDoc}
206224
*/
207225
@Override
208226
public <_2Prime> Tuple2<_1, _2> discardR(Applicative<_2Prime, Tuple2<_1, ?>> appB) {
209-
return MonadRec.super.discardR(appB).coerce();
227+
return BimonadRec.super.discardR(appB).coerce();
210228
}
211229

212230
/**

src/main/java/com/jnape/palatable/lambda/adt/hlist/Tuple3.java

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import com.jnape.palatable.lambda.adt.Maybe;
44
import com.jnape.palatable.lambda.adt.hlist.HList.HCons;
55
import com.jnape.palatable.lambda.adt.product.Product3;
6+
import com.jnape.palatable.lambda.bimonad.BimonadRec;
7+
import com.jnape.palatable.lambda.comonad.Comonad;
68
import com.jnape.palatable.lambda.functions.Fn1;
79
import com.jnape.palatable.lambda.functions.builtin.fn2.Into;
810
import com.jnape.palatable.lambda.functions.recursion.RecursiveResult;
@@ -33,7 +35,7 @@
3335
*/
3436
public class Tuple3<_1, _2, _3> extends HCons<_1, Tuple2<_2, _3>> implements
3537
Product3<_1, _2, _3>,
36-
MonadRec<_3, Tuple3<_1, _2, ?>>,
38+
BimonadRec<_3, Tuple3<_1, _2, ?>>,
3739
Bifunctor<_2, _3, Tuple3<_1, ?, ?>>,
3840
Traversable<_3, Tuple3<_1, _2, ?>> {
3941

@@ -115,12 +117,28 @@ public Tuple3<_2, _1, _3> invert() {
115117
return tuple(_2, _1, _3);
116118
}
117119

120+
/**
121+
* {@inheritDoc}
122+
*/
123+
@Override
124+
public _3 extract() {
125+
return _3;
126+
}
127+
128+
/**
129+
* {@inheritDoc}
130+
*/
131+
@Override
132+
public <B> Tuple3<_1, _2, B> extendImpl(Fn1<? super Comonad<_3, Tuple3<_1, _2, ?>>, ? extends B> f) {
133+
return tuple(_1, _2, f.apply(this));
134+
}
135+
118136
/**
119137
* {@inheritDoc}
120138
*/
121139
@Override
122140
public <_3Prime> Tuple3<_1, _2, _3Prime> fmap(Fn1<? super _3, ? extends _3Prime> fn) {
123-
return (Tuple3<_1, _2, _3Prime>) MonadRec.super.<_3Prime>fmap(fn);
141+
return (Tuple3<_1, _2, _3Prime>) BimonadRec.super.<_3Prime>fmap(fn);
124142
}
125143

126144
/**
@@ -171,23 +189,23 @@ public <_3Prime> Tuple3<_1, _2, _3Prime> zip(
171189
@Override
172190
public <_3Prime> Lazy<Tuple3<_1, _2, _3Prime>> lazyZip(
173191
Lazy<? extends Applicative<Fn1<? super _3, ? extends _3Prime>, Tuple3<_1, _2, ?>>> lazyAppFn) {
174-
return MonadRec.super.lazyZip(lazyAppFn).fmap(Monad<_3Prime, Tuple3<_1, _2, ?>>::coerce);
192+
return BimonadRec.super.lazyZip(lazyAppFn).fmap(Monad<_3Prime, Tuple3<_1, _2, ?>>::coerce);
175193
}
176194

177195
/**
178196
* {@inheritDoc}
179197
*/
180198
@Override
181199
public <_3Prime> Tuple3<_1, _2, _3Prime> discardL(Applicative<_3Prime, Tuple3<_1, _2, ?>> appB) {
182-
return MonadRec.super.discardL(appB).coerce();
200+
return BimonadRec.super.discardL(appB).coerce();
183201
}
184202

185203
/**
186204
* {@inheritDoc}
187205
*/
188206
@Override
189207
public <_3Prime> Tuple3<_1, _2, _3> discardR(Applicative<_3Prime, Tuple3<_1, _2, ?>> appB) {
190-
return MonadRec.super.discardR(appB).coerce();
208+
return BimonadRec.super.discardR(appB).coerce();
191209
}
192210

193211
/**

src/main/java/com/jnape/palatable/lambda/adt/hlist/Tuple4.java

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import com.jnape.palatable.lambda.adt.Maybe;
44
import com.jnape.palatable.lambda.adt.hlist.HList.HCons;
55
import com.jnape.palatable.lambda.adt.product.Product4;
6+
import com.jnape.palatable.lambda.bimonad.BimonadRec;
7+
import com.jnape.palatable.lambda.comonad.Comonad;
68
import com.jnape.palatable.lambda.functions.Fn1;
79
import com.jnape.palatable.lambda.functions.builtin.fn2.Into;
810
import com.jnape.palatable.lambda.functions.recursion.RecursiveResult;
@@ -34,7 +36,7 @@
3436
*/
3537
public class Tuple4<_1, _2, _3, _4> extends HCons<_1, Tuple3<_2, _3, _4>> implements
3638
Product4<_1, _2, _3, _4>,
37-
MonadRec<_4, Tuple4<_1, _2, _3, ?>>,
39+
BimonadRec<_4, Tuple4<_1, _2, _3, ?>>,
3840
Bifunctor<_3, _4, Tuple4<_1, _2, ?, ?>>,
3941
Traversable<_4, Tuple4<_1, _2, _3, ?>> {
4042

@@ -142,12 +144,28 @@ public Tuple4<_2, _1, _3, _4> invert() {
142144
return tuple(_2, _1, _3, _4);
143145
}
144146

147+
/**
148+
* {@inheritDoc}
149+
*/
150+
@Override
151+
public _4 extract() {
152+
return _4;
153+
}
154+
155+
/**
156+
* {@inheritDoc}
157+
*/
158+
@Override
159+
public <B> Tuple4<_1, _2, _3, B> extendImpl(Fn1<? super Comonad<_4, Tuple4<_1, _2, _3, ?>>, ? extends B> f) {
160+
return tuple(_1, _2, _3, f.apply(this));
161+
}
162+
145163
/**
146164
* {@inheritDoc}
147165
*/
148166
@Override
149167
public <_4Prime> Tuple4<_1, _2, _3, _4Prime> fmap(Fn1<? super _4, ? extends _4Prime> fn) {
150-
return (Tuple4<_1, _2, _3, _4Prime>) MonadRec.super.<_4Prime>fmap(fn);
168+
return (Tuple4<_1, _2, _3, _4Prime>) BimonadRec.super.<_4Prime>fmap(fn);
151169
}
152170

153171
/**
@@ -198,23 +216,23 @@ public <_4Prime> Tuple4<_1, _2, _3, _4Prime> zip(
198216
@Override
199217
public <_4Prime> Lazy<Tuple4<_1, _2, _3, _4Prime>> lazyZip(
200218
Lazy<? extends Applicative<Fn1<? super _4, ? extends _4Prime>, Tuple4<_1, _2, _3, ?>>> lazyAppFn) {
201-
return MonadRec.super.lazyZip(lazyAppFn).fmap(Monad<_4Prime, Tuple4<_1, _2, _3, ?>>::coerce);
219+
return BimonadRec.super.lazyZip(lazyAppFn).fmap(Monad<_4Prime, Tuple4<_1, _2, _3, ?>>::coerce);
202220
}
203221

204222
/**
205223
* {@inheritDoc}
206224
*/
207225
@Override
208226
public <_4Prime> Tuple4<_1, _2, _3, _4Prime> discardL(Applicative<_4Prime, Tuple4<_1, _2, _3, ?>> appB) {
209-
return MonadRec.super.discardL(appB).coerce();
227+
return BimonadRec.super.discardL(appB).coerce();
210228
}
211229

212230
/**
213231
* {@inheritDoc}
214232
*/
215233
@Override
216234
public <_4Prime> Tuple4<_1, _2, _3, _4> discardR(Applicative<_4Prime, Tuple4<_1, _2, _3, ?>> appB) {
217-
return MonadRec.super.discardR(appB).coerce();
235+
return BimonadRec.super.discardR(appB).coerce();
218236
}
219237

220238
/**

0 commit comments

Comments
 (0)