content: {- |
  Module      :  ./Common/Lib/Maybe.hs
  Description :  MaybeT monad transformer without the non-portable features
  Copyright   :  C. Maeder and Uni Bremen 2002-2005
  License     :  GPLv2 or higher, see LICENSE.txt
  
  Maintainer  :  jonathan.von_schroeder@dfki.de
  Stability   :  experimental
  Portability :  portable
  
  This module is a replacement of module Control.Monad.Maybe
  and only contains the Monad instance for the newtype MaybeT m.
  
  -}
  
  module Common.Lib.Maybe (MaybeT (..), liftToMaybeT) where
  
  import Control.Applicative ()
  import Control.Monad
  import qualified Control.Monad.Fail as Fail
  
  -- | A monad transformer which adds Maybe semantics to an existing monad.
  newtype MaybeT m a = MaybeT { runMaybeT :: m (Maybe a) }
  
  instance Monad m => Functor (MaybeT m) where
    fmap = liftM
  
  instance Monad m => Applicative (MaybeT m) where
    pure = return
    (<*>) = ap
  
  instance Monad m => Monad (MaybeT m) where
    return = MaybeT . return . Just
    x >>= f = MaybeT $ runMaybeT x >>= maybe (return Nothing) (runMaybeT . f)
  
  instance Monad m => Fail.MonadFail (MaybeT m) where
    fail _ = MaybeT $ return Nothing
  
  liftToMaybeT :: Monad m => m a -> MaybeT m a
  liftToMaybeT = MaybeT . liftM Just
  