module HaskellWorks.Error
  ( onLeft
  , onNothing
  , onLeftM
  , onNothingM
  ) where

import           HaskellWorks.Polysemy.Prelude

onLeft :: forall e m a. Monad m => (e -> m a) -> Either e a -> m a
onLeft :: forall e (m :: * -> *) a.
Monad m =>
(e -> m a) -> Either e a -> m a
onLeft e -> m a
f = (e -> m a) -> (a -> m a) -> Either e a -> m a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either e -> m a
f a -> m a
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure

onNothing :: forall a m. Monad m => m a -> Maybe a -> m a
onNothing :: forall a (m :: * -> *). Monad m => m a -> Maybe a -> m a
onNothing m a
h = m a -> (a -> m a) -> Maybe a -> m a
forall b a. b -> (a -> b) -> Maybe a -> b
maybe m a
h a -> m a
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return

onLeftM :: forall e m a. Monad m => (e -> m a) -> m (Either e a) -> m a
onLeftM :: forall e (m :: * -> *) a.
Monad m =>
(e -> m a) -> m (Either e a) -> m a
onLeftM e -> m a
f m (Either e a)
action = (e -> m a) -> Either e a -> m a
forall e (m :: * -> *) a.
Monad m =>
(e -> m a) -> Either e a -> m a
onLeft e -> m a
f (Either e a -> m a) -> m (Either e a) -> m a
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< m (Either e a)
action

onNothingM :: forall a m. Monad m => m a -> m (Maybe a) -> m a
onNothingM :: forall a (m :: * -> *). Monad m => m a -> m (Maybe a) -> m a
onNothingM m a
h m (Maybe a)
f = m a -> Maybe a -> m a
forall a (m :: * -> *). Monad m => m a -> Maybe a -> m a
onNothing m a
h (Maybe a -> m a) -> m (Maybe a) -> m a
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< m (Maybe a)
f