1313import com .jnape .palatable .lambda .functor .builtin .Lazy ;
1414import com .jnape .palatable .lambda .io .IO ;
1515import com .jnape .palatable .lambda .monad .Monad ;
16+ import com .jnape .palatable .lambda .monad .MonadError ;
1617import com .jnape .palatable .lambda .traversable .Traversable ;
1718
1819import java .util .Objects ;
3233 */
3334public abstract class Either <L , R > implements
3435 CoProduct2 <L , R , Either <L , R >>,
35- Monad < R , Either <L , ?>>,
36+ MonadError < L , R , Either <L , ?>>,
3637 Traversable <R , Either <L , ?>>,
3738 Bifunctor <L , R , Either <?, ?>> {
3839
@@ -206,7 +207,7 @@ public <C> Choice3<L, R, C> diverge() {
206207 */
207208 @ Override
208209 public final <R2 > Either <L , R2 > fmap (Fn1 <? super R , ? extends R2 > fn ) {
209- return Monad .super .<R2 >fmap (fn ).coerce ();
210+ return MonadError .super .<R2 >fmap (fn ).coerce ();
210211 }
211212
212213 /**
@@ -247,7 +248,7 @@ public final <R2> Either<L, R2> pure(R2 r2) {
247248 */
248249 @ Override
249250 public final <R2 > Either <L , R2 > zip (Applicative <Fn1 <? super R , ? extends R2 >, Either <L , ?>> appFn ) {
250- return Monad .super .zip (appFn ).coerce ();
251+ return MonadError .super .zip (appFn ).coerce ();
251252 }
252253
253254 /**
@@ -265,15 +266,31 @@ public <R2> Lazy<Either<L, R2>> lazyZip(
265266 */
266267 @ Override
267268 public final <R2 > Either <L , R2 > discardL (Applicative <R2 , Either <L , ?>> appB ) {
268- return Monad .super .discardL (appB ).coerce ();
269+ return MonadError .super .discardL (appB ).coerce ();
269270 }
270271
271272 /**
272273 * {@inheritDoc}
273274 */
274275 @ Override
275276 public final <R2 > Either <L , R > discardR (Applicative <R2 , Either <L , ?>> appB ) {
276- return Monad .super .discardR (appB ).coerce ();
277+ return MonadError .super .discardR (appB ).coerce ();
278+ }
279+
280+ /**
281+ * {@inheritDoc}
282+ */
283+ @ Override
284+ public Either <L , R > throwError (L l ) {
285+ return left (l );
286+ }
287+
288+ /**
289+ * {@inheritDoc}
290+ */
291+ @ Override
292+ public Either <L , R > catchError (Fn1 <? super L , ? extends Monad <R , Either <L , ?>>> recoveryFn ) {
293+ return match (recoveryFn .fmap (Monad ::coerce ), Either ::right );
277294 }
278295
279296 /**
0 commit comments