Skip to content

Commit 19cd301

Browse files
committed
Loosening Lens to simply require Cartesian
1 parent 4a56fb1 commit 19cd301

2 files changed

Lines changed: 36 additions & 20 deletions

File tree

src/main/java/com/jnape/palatable/lambda/adt/hmap/Schema.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
import com.jnape.palatable.lambda.adt.hlist.Tuple6;
1212
import com.jnape.palatable.lambda.adt.hlist.Tuple7;
1313
import com.jnape.palatable.lambda.adt.hlist.Tuple8;
14-
import com.jnape.palatable.lambda.functions.Fn1;
1514
import com.jnape.palatable.lambda.functions.builtin.fn2.Both;
15+
import com.jnape.palatable.lambda.functor.Cartesian;
1616
import com.jnape.palatable.lambda.functor.Functor;
1717
import com.jnape.palatable.lambda.functor.Profunctor;
1818
import com.jnape.palatable.lambda.optics.Lens;
@@ -39,8 +39,12 @@ default <A, NewValues extends HCons<A, Values>> Schema<NewValues> add(TypeSafeKe
3939
maybeNewValues -> maybeNewValues.fmap(HCons<A, Values>::head)));
4040
return new Schema<NewValues>() {
4141
@Override
42-
public <CoP extends Profunctor<?, ?, ? extends Fn1<?, ?>>, CoF extends Functor<?, ? extends Functor<?, ?>>, FB extends Functor<Maybe<NewValues>, ? extends CoF>, FT extends Functor<HMap, ? extends CoF>, PAFB extends Profunctor<Maybe<NewValues>, FB, ? extends CoP>, PSFT extends Profunctor<HMap, FT, ? extends CoP>> PSFT apply(
43-
PAFB pafb) {
42+
public <CoP extends Profunctor<?, ?, ? extends Cartesian<?, ?, ?>>,
43+
CoF extends Functor<?, ? extends Functor<?, ?>>,
44+
FB extends Functor<Maybe<NewValues>, ? extends CoF>,
45+
FT extends Functor<HMap, ? extends CoF>,
46+
PAFB extends Profunctor<Maybe<NewValues>, FB, ? extends CoP>,
47+
PSFT extends Profunctor<HMap, FT, ? extends CoP>> PSFT apply(PAFB pafb) {
4448
return lens.apply(pafb);
4549
}
4650
};
@@ -52,8 +56,12 @@ static <A> Schema<SingletonHList<A>> schema(TypeSafeKey<?, A> key) {
5256
.mapB(maybeSingletonA -> maybeSingletonA.fmap(HCons::head));
5357
return new Schema<SingletonHList<A>>() {
5458
@Override
55-
public <CoP extends Profunctor<?, ?, ? extends Fn1<?, ?>>, CoF extends Functor<?, ? extends Functor<?, ?>>, FB extends Functor<Maybe<SingletonHList<A>>, ? extends CoF>, FT extends Functor<HMap, ? extends CoF>, PAFB extends Profunctor<Maybe<SingletonHList<A>>, FB, ? extends CoP>, PSFT extends Profunctor<HMap, FT, ? extends CoP>> PSFT apply(
56-
PAFB pafb) {
59+
public <CoP extends Profunctor<?, ?, ? extends Cartesian<?, ?, ?>>,
60+
CoF extends Functor<?, ? extends Functor<?, ?>>,
61+
FB extends Functor<Maybe<SingletonHList<A>>, ? extends CoF>,
62+
FT extends Functor<HMap, ? extends CoF>,
63+
PAFB extends Profunctor<Maybe<SingletonHList<A>>, FB, ? extends CoP>,
64+
PSFT extends Profunctor<HMap, FT, ? extends CoP>> PSFT apply(PAFB pafb) {
5765
return lens.apply(pafb);
5866
}
5967
};

src/main/java/com/jnape/palatable/lambda/optics/Lens.java

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@
55
import com.jnape.palatable.lambda.functions.Fn2;
66
import com.jnape.palatable.lambda.functions.builtin.fn2.Both;
77
import com.jnape.palatable.lambda.functor.Applicative;
8+
import com.jnape.palatable.lambda.functor.Cartesian;
89
import com.jnape.palatable.lambda.functor.Functor;
910
import com.jnape.palatable.lambda.functor.Profunctor;
1011
import com.jnape.palatable.lambda.monad.Monad;
1112

13+
import static com.jnape.palatable.lambda.adt.hlist.HList.tuple;
14+
import static com.jnape.palatable.lambda.functions.builtin.fn2.Into.into;
1215
import static com.jnape.palatable.lambda.optics.Iso.iso;
1316
import static com.jnape.palatable.lambda.optics.Lens.Simple.adapt;
1417
import static com.jnape.palatable.lambda.optics.functions.Set.set;
@@ -138,7 +141,7 @@
138141
*/
139142
@FunctionalInterface
140143
public interface Lens<S, T, A, B> extends
141-
Optic<Fn1<?, ?>, Functor<?, ?>, S, T, A, B>,
144+
Optic<Cartesian<?, ?, ?>, Functor<?, ?>, S, T, A, B>,
142145
Monad<T, Lens<S, ?, A, B>>,
143146
Profunctor<S, T, Lens<?, ?, A, B>> {
144147

@@ -269,15 +272,15 @@ default Iso<S, T, A, B> toIso(S s) {
269272
* {@inheritDoc}
270273
*/
271274
@Override
272-
default <C, D> Lens<S, T, C, D> andThen(Optic<? super Fn1<?, ?>, ? super Functor<?, ?>, A, B, C, D> f) {
275+
default <C, D> Lens<S, T, C, D> andThen(Optic<? super Cartesian<?, ?, ?>, ? super Functor<?, ?>, A, B, C, D> f) {
273276
return lens(Optic.super.andThen(f));
274277
}
275278

276279
/**
277280
* {@inheritDoc}
278281
*/
279282
@Override
280-
default <R, U> Lens<R, U, A, B> compose(Optic<? super Fn1<?, ?>, ? super Functor<?, ?>, R, U, S, T> g) {
283+
default <R, U> Lens<R, U, A, B> compose(Optic<? super Cartesian<?, ?, ?>, ? super Functor<?, ?>, R, U, S, T> g) {
281284
return lens(Optic.super.compose(g));
282285
}
283286

@@ -294,13 +297,14 @@ default <R, U> Lens<R, U, A, B> compose(Optic<? super Fn1<?, ?>, ? super Functor
294297
*/
295298
static <S, T, A, B> Lens<S, T, A, B> lens(Fn1<? super S, ? extends A> getter,
296299
Fn2<? super S, ? super B, ? extends T> setter) {
297-
return lens(Optic.<Fn1<?, ?>, Functor<?, ?>,
300+
return lens(Optic.<Cartesian<?, ?, ?>, Functor<?, ?>,
298301
S, T, A, B,
299302
Functor<B, ? extends Functor<?, ?>>,
300303
Functor<T, ? extends Functor<?, ?>>,
301-
Fn1<A, Functor<B, ? extends Functor<?, ?>>>,
302-
Fn1<S, Functor<T, ? extends Functor<?, ?>>>>optic(afb -> s -> afb.apply(getter.apply(s))
303-
.fmap(b -> setter.apply(s, b))));
304+
Cartesian<A, Functor<B, ? extends Functor<?, ?>>, ? extends Cartesian<?, ?, ?>>,
305+
Cartesian<S, Functor<T, ? extends Functor<?, ?>>, ? extends Cartesian<?, ?, ?>>>optic(
306+
afb -> afb.<S>cartesian().diMap(s -> tuple(s, getter.apply(s)),
307+
into((s, fb) -> fb.fmap(setter.apply(s))))));
304308
}
305309

306310
/**
@@ -313,11 +317,14 @@ static <S, T, A, B> Lens<S, T, A, B> lens(Fn1<? super S, ? extends A> getter,
313317
* @param <B> the type of the "smaller" update value
314318
* @return the {@link Lens}
315319
*/
316-
static <S, T, A, B> Lens<S, T, A, B> lens(Optic<? super Fn1<?, ?>, ? super Functor<?, ?>, S, T, A, B> optic) {
320+
static <S, T, A, B> Lens<S, T, A, B> lens(
321+
Optic<? super Cartesian<?, ?, ?>, ? super Functor<?, ?>, S, T, A, B> optic) {
317322
return new Lens<S, T, A, B>() {
318323
@Override
319-
public <CoP extends Profunctor<?, ?, ? extends Fn1<?, ?>>, CoF extends Functor<?, ? extends Functor<?, ?>>,
320-
FB extends Functor<B, ? extends CoF>, FT extends Functor<T, ? extends CoF>,
324+
public <CoP extends Profunctor<?, ?, ? extends Cartesian<?, ?, ?>>,
325+
CoF extends Functor<?, ? extends Functor<?, ?>>,
326+
FB extends Functor<B, ? extends CoF>,
327+
FT extends Functor<T, ? extends CoF>,
321328
PAFB extends Profunctor<A, FB, ? extends CoP>,
322329
PSFT extends Profunctor<S, FT, ? extends CoP>> PSFT apply(PAFB pafb) {
323330
return optic.apply(pafb);
@@ -378,21 +385,21 @@ static <S, A, B> Lens.Simple<S, Tuple2<A, B>> both(Lens.Simple<S, A> f, Lens.Sim
378385
* @param <A> the type of both "smaller" values
379386
*/
380387
@FunctionalInterface
381-
interface Simple<S, A> extends Lens<S, S, A, A>, Optic.Simple<Fn1<?, ?>, Functor<?, ?>, S, A> {
388+
interface Simple<S, A> extends Lens<S, S, A, A>, Optic.Simple<Cartesian<?, ?, ?>, Functor<?, ?>, S, A> {
382389

383390
/**
384391
* {@inheritDoc}
385392
*/
386393
@Override
387-
default <B> Lens.Simple<S, B> andThen(Optic.Simple<? super Fn1<?, ?>, ? super Functor<?, ?>, A, B> f) {
394+
default <B> Lens.Simple<S, B> andThen(Optic.Simple<? super Cartesian<?, ?, ?>, ? super Functor<?, ?>, A, B> f) {
388395
return Lens.Simple.adapt(Lens.super.andThen(f));
389396
}
390397

391398
/**
392399
* {@inheritDoc}
393400
*/
394401
@Override
395-
default <R> Lens.Simple<R, A> compose(Optic.Simple<? super Fn1<?, ?>, ? super Functor<?, ?>, R, S> g) {
402+
default <R> Lens.Simple<R, A> compose(Optic.Simple<? super Cartesian<?, ?, ?>, ? super Functor<?, ?>, R, S> g) {
396403
return Lens.Simple.adapt(Lens.super.compose(g));
397404
}
398405

@@ -404,10 +411,11 @@ default <R> Lens.Simple<R, A> compose(Optic.Simple<? super Fn1<?, ?>, ? super Fu
404411
* @param <A> A/B
405412
* @return the simple lens
406413
*/
407-
static <S, A> Lens.Simple<S, A> adapt(Optic<? super Fn1<?, ?>, ? super Functor<?, ?>, S, S, A, A> lens) {
414+
static <S, A> Lens.Simple<S, A> adapt(
415+
Optic<? super Cartesian<?, ?, ?>, ? super Functor<?, ?>, S, S, A, A> lens) {
408416
return new Lens.Simple<S, A>() {
409417
@Override
410-
public <CoP extends Profunctor<?, ?, ? extends Fn1<?, ?>>,
418+
public <CoP extends Profunctor<?, ?, ? extends Cartesian<?, ?, ?>>,
411419
CoF extends Functor<?, ? extends Functor<?, ?>>, FB extends Functor<A, ? extends CoF>,
412420
FT extends Functor<S, ? extends CoF>, PAFB extends Profunctor<A, FB, ? extends CoP>,
413421
PSFT extends Profunctor<S, FT, ? extends CoP>> PSFT apply(PAFB pafb) {

0 commit comments

Comments
 (0)