Skip to content

Commit bde5812

Browse files
committed
Prisms are Profunctors
1 parent 03eca04 commit bde5812

File tree

1 file changed

+37
-1
lines changed
  • src/main/java/com/jnape/palatable/lambda/optics

1 file changed

+37
-1
lines changed

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

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,10 @@
5353
* @param <B> the input that guarantees its output
5454
*/
5555
@FunctionalInterface
56-
public interface Prism<S, T, A, B> extends ProtoOptic<Cocartesian<?, ?, ?>, S, T, A, B>, Monad<T, Prism<S, ?, A, B>> {
56+
public interface Prism<S, T, A, B> extends
57+
ProtoOptic<Cocartesian<?, ?, ?>, S, T, A, B>,
58+
Monad<T, Prism<S, ?, A, B>>,
59+
Profunctor<S, T, Prism<?, ?, A, B>> {
5760

5861
/**
5962
* Recover the two mappings encapsulated by this {@link Prism} by sending it through a {@link Market}.
@@ -140,6 +143,39 @@ default <U> Prism<S, T, A, B> discardR(Applicative<U, Prism<S, ?, A, B>> appB) {
140143
return Monad.super.discardR(appB).coerce();
141144
}
142145

146+
/**
147+
* {@inheritDoc}
148+
*/
149+
@Override
150+
default <R, U> Prism<R, U, A, B> diMap(Fn1<? super R, ? extends S> lFn,
151+
Fn1<? super T, ? extends U> rFn) {
152+
return unPrism().into((bt, seta) -> prism(seta.diMap(lFn, tOrA -> tOrA.biMapL(rFn)), bt.fmap(rFn)));
153+
}
154+
155+
/**
156+
* {@inheritDoc}
157+
*/
158+
@Override
159+
default <R> Prism<R, T, A, B> diMapL(Fn1<? super R, ? extends S> fn) {
160+
return (Prism<R, T, A, B>) Profunctor.super.<R>diMapL(fn);
161+
}
162+
163+
/**
164+
* {@inheritDoc}
165+
*/
166+
@Override
167+
default <U> Prism<S, U, A, B> diMapR(Fn1<? super T, ? extends U> fn) {
168+
return (Prism<S, U, A, B>) Profunctor.super.<U>diMapR(fn);
169+
}
170+
171+
/**
172+
* {@inheritDoc}
173+
*/
174+
@Override
175+
default <R> Prism<R, T, A, B> contraMap(Fn1<? super R, ? extends S> fn) {
176+
return (Prism<R, T, A, B>) Profunctor.super.<R>contraMap(fn);
177+
}
178+
143179
/**
144180
* Static factory method for creating a {@link Prism} given a mapping from
145181
* <code>S -&gt; {@link Either}&lt;T, A&gt;</code> and a mapping from <code>B -&gt; T</code>.

0 commit comments

Comments
 (0)