module Control.Monad.Short
    ( MonadShortable
    , MonadErrorShortable
    , short
    , unShort
    , MonadShort(..)
    ) where

import Control.Monad.Abort
import Control.Monad.Trans.Class

type MonadShortable r m a = AbortT r m a
type MonadErrorShortable m a = MonadShortable String m a

short :: (Monad m) => m a -> MonadShortable r m a
short = lift

unShort :: (Monad m) => MonadShortable r m r -> m r
unShort = runAbortT

-- | Minimal complete definition: unError
class (Monad m) => MonadShort m where
    unError       :: r -> MonadErrorShortable m a -> MonadShortable r m a

    unError_      :: MonadErrorShortable m a -> MonadShortable () m a
    unErrorShort  :: r -> MonadErrorShortable m r -> m r
    unErrorShort_ :: MonadErrorShortable m () -> m ()

    unError_        = unError ()
    unErrorShort  r = unShort . unError r
    unErrorShort_   = unShort . unError_