|
53 | 53 | * @param <B> the input that guarantees its output
|
54 | 54 | */
|
55 | 55 | @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>> { |
57 | 60 |
|
58 | 61 | /**
|
59 | 62 | * 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) {
|
140 | 143 | return Monad.super.discardR(appB).coerce();
|
141 | 144 | }
|
142 | 145 |
|
| 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 | + |
143 | 179 | /**
|
144 | 180 | * Static factory method for creating a {@link Prism} given a mapping from
|
145 | 181 | * <code>S -> {@link Either}<T, A></code> and a mapping from <code>B -> T</code>.
|
|
0 commit comments