module Data.Functor.Extend.Trans.Maybe
( MaybeT(..), maybeT, nothing, justT ) where
import Control.Applicative
import Data.Functor.Apply
import Data.Functor.Alt
import Data.Functor.Extend
data MaybeT w a = MaybeT { runMaybeT :: Maybe (w a) }
instance Functor w => Functor (MaybeT w) where
fmap f = MaybeT . fmap (fmap f) . runMaybeT
instance Extend w => Extend (MaybeT w) where
duplicate (MaybeT (Just w)) = MaybeT $ Just $ extend (MaybeT . Just) w
duplicate (MaybeT Nothing) = MaybeT Nothing
maybeT :: a -> (w b -> a) -> MaybeT w b -> a
maybeT z f = maybe z f . runMaybeT
nothing :: MaybeT w a
nothing = MaybeT Nothing
justT :: w a -> MaybeT w a
justT = MaybeT . Just
instance Apply w => Apply (MaybeT w) where
MaybeT a <.> MaybeT b = MaybeT $ (<.>) <$> a <.> b
instance Applicative w => Applicative (MaybeT w) where
pure = MaybeT . Just . pure
MaybeT a <*> MaybeT b = MaybeT $ (<*>) <$> a <*> b
instance Apply w => Alt (MaybeT w) where
MaybeT a <!> MaybeT b = MaybeT $ a <!> b
instance Applicative w => Alternative (MaybeT w) where
empty = MaybeT Nothing
MaybeT a <|> MaybeT b = MaybeT $ a <|> b