66import com .jnape .palatable .lambda .functor .Applicative ;
77import com .jnape .palatable .lambda .functor .Cocartesian ;
88import com .jnape .palatable .lambda .monad .Monad ;
9+ import com .jnape .palatable .lambda .optics .Prism ;
910
1011import java .util .function .Function ;
1112
1516import static com .jnape .palatable .lambda .functions .Fn1 .fn1 ;
1617import static com .jnape .palatable .lambda .functions .builtin .fn1 .Constantly .constantly ;
1718
19+ /**
20+ * A profunctor used to extract the isomorphic functions a {@link Prism} is composed of.
21+ *
22+ * @param <A> the output that might fail to be produced
23+ * @param <B> the input that guarantees its output
24+ * @param <S> the input that might fail to map to its output
25+ * @param <T> the guaranteed output
26+ */
1827public final class Market <A , B , S , T > implements
1928 Monad <T , Market <A , B , S , ?>>,
2029 Cocartesian <S , T , Market <A , B , ?, ?>> {
@@ -27,11 +36,35 @@ public Market(Function<? super B, ? extends T> bt, Function<? super S, ? extends
2736 this .sta = fn1 (sta );
2837 }
2938
39+ /**
40+ * Extract the mapping <code>B -> T</code>.
41+ *
42+ * @return a <code>{@link Function}<B, T></code>
43+ */
44+ public Fn1 <? super B , ? extends T > bt () {
45+ return bt ;
46+ }
47+
48+ /**
49+ * Extract the mapping <code>S -> {@link Either}<T, A></code>.
50+ *
51+ * @return a <code>{@link Function}<S, {@link Either}<T, A>></code>
52+ */
53+ public Fn1 <? super S , ? extends Either <T , A >> sta () {
54+ return sta ;
55+ }
56+
57+ /**
58+ * {@inheritDoc}
59+ */
3060 @ Override
3161 public <U > Market <A , B , S , U > pure (U u ) {
3262 return new Market <>(constantly (u ), constantly (left (u )));
3363 }
3464
65+ /**
66+ * {@inheritDoc}
67+ */
3568 @ Override
3669 public <U > Market <A , B , S , U > flatMap (Function <? super T , ? extends Monad <U , Market <A , B , S , ?>>> f ) {
3770 return new Market <>(b -> f .apply (bt ().apply (b )).<Market <A , B , S , U >>coerce ().bt ().apply (b ),
@@ -40,49 +73,62 @@ public <U> Market<A, B, S, U> flatMap(Function<? super T, ? extends Monad<U, Mar
4073 .apply (s ).invert ()).invert ());
4174 }
4275
76+ /**
77+ * {@inheritDoc}
78+ */
4379 @ Override
4480 public <U > Market <A , B , S , U > zip (Applicative <Function <? super T , ? extends U >, Market <A , B , S , ?>> appFn ) {
4581 Market <A , B , S , Function <? super T , ? extends U >> marketF = appFn .coerce ();
4682 return new Market <>(b -> marketF .bt ().apply (b ).apply (bt ().apply (b )),
4783 s -> sta ().apply (s ).invert ().zip (marketF .sta ().apply (s ).invert ()).invert ());
4884 }
4985
50- public Fn1 <? super B , ? extends T > bt () {
51- return bt ;
52- }
53-
54- public Fn1 <? super S , ? extends Either <T , A >> sta () {
55- return sta ;
56- }
57-
86+ /**
87+ * {@inheritDoc}
88+ */
5889 @ Override
5990 public <U > Market <A , B , S , U > fmap (Function <? super T , ? extends U > fn ) {
6091 return diMapR (fn );
6192 }
6293
94+ /**
95+ * {@inheritDoc}
96+ */
6397 @ Override
6498 public <C > Market <A , B , Choice2 <C , S >, Choice2 <C , T >> cocartesian () {
6599 return new Market <>(bt .fmap (Choice2 ::b ),
66100 cs -> cs .fmap (sta ).match (c -> left (a (c )),
67101 tOrA -> tOrA .match (t -> left (b (t )), Either ::right )));
68102 }
69103
104+ /**
105+ * {@inheritDoc}
106+ */
70107 @ Override
71108 public <R , U > Market <A , B , R , U > diMap (Function <? super R , ? extends S > lFn ,
72109 Function <? super T , ? extends U > rFn ) {
73110 return new Market <>(bt .fmap (rFn ), sta .diMapL (lFn ).diMapR (c -> c .biMapL (rFn )));
74111 }
75112
113+ /**
114+ * {@inheritDoc}
115+ */
76116 @ Override
77117 public <R > Market <A , B , R , T > diMapL (Function <? super R , ? extends S > fn ) {
78118 return (Market <A , B , R , T >) Cocartesian .super .<R >diMapL (fn );
79119 }
80120
121+ /**
122+ * {@inheritDoc}
123+ */
81124 @ Override
82125 public <U > Market <A , B , S , U > diMapR (Function <? super T , ? extends U > fn ) {
83126 return (Market <A , B , S , U >) Cocartesian .super .<U >diMapR (fn );
84127 }
85128
129+ /**
130+ * {@inheritDoc}
131+ */
86132 @ Override
87133 public <R > Market <A , B , R , T > contraMap (Function <? super R , ? extends S > fn ) {
88134 return (Market <A , B , R , T >) Cocartesian .super .<R >contraMap (fn );
0 commit comments