module Language.Haskell.Tools.Refactor.Utils.Maybe
 ( module Language.Haskell.Tools.Refactor.Utils.Maybe
 , module Data.Maybe
 , MaybeT(..)
 ) where

import Data.Maybe
import Control.Monad
import Control.Monad.Trans.Maybe (MaybeT(..))

liftMaybe :: (Monad m) => Maybe a -> MaybeT m a
liftMaybe = MaybeT . return

maybeT :: Monad m => b -> (a -> b) -> MaybeT m a -> m b
maybeT def f x = liftM (maybe def f) (runMaybeT x)

maybeTM :: Monad m => m b -> (a -> m b) -> MaybeT m a -> m b
maybeTM def f x = runMaybeT x >>= maybe def f