references-0.2.0.0: Control/Reference/TH/MonadInstances.hs
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE TypeFamilies, RankNTypes #-}
{-# LANGUAGE FlexibleContexts, FlexibleInstances, MultiParamTypeClasses, UndecidableInstances #-}
-- | A basic set of instances derived using "Control.Reference.TH.Monad".
--
-- == Structure defined
--
-- @
-- 'ListT' 'IO'
-- / \\
-- [] 'Control.Monad.Trans.Maybe.MaybeT' 'IO'
-- | / |
-- 'Maybe' 'IO'
-- \\ /
-- 'Control.Monad.Trans.Identity.Identity'
-- @
module Control.Reference.TH.MonadInstances () where
import Control.Reference.InternalInterface
import Control.Reference.TH.Monad
import Control.Monad.Identity
import Control.Monad.Trans.Maybe as Trans
import Control.Monad.Trans.List as Trans
import Data.Maybe
import Language.Haskell.TH as TH
$(makeMonadRepr ''Identity ''Maybe [e| return . runIdentity |])
$(makeMonadRepr ''Identity ''IO [e| return . runIdentity |])
$(makeMonadRepr ''Maybe [t| MaybeT IO |] [e| MaybeT . return |])
$(makeMonadRepr ''IO [t| MaybeT IO |] [e| MaybeT . liftM Just |])
$(makeMonadRepr ''Maybe TH.ListT [e| maybeToList |])
$(makeMonadRepr TH.ListT [t| Trans.ListT IO |] [e| Trans.ListT . return |])
$(makeMonadRepr ''IO [t| Trans.ListT IO |] [e| Trans.ListT . liftM (:[]) |])
$(makeMonadRepr [t| MaybeT IO |] [t| Trans.ListT IO |] [e| Trans.ListT . liftM maybeToList . runMaybeT |])