module MonadLab.ListIo (
listIoMonad
) where
import Prelude hiding (Monad)
import Language.Haskell.TH
import MonadLab.CommonTypes
listIoMonad :: Monad
listIoMonad = (listIoTypeCon , listIoReturn , listIoBind, [(List, [merge]), (Io, [liftIO])], listIoBaseLift)
listIoTypeCon :: MonadTypeCon
listIoTypeCon = \t -> appT listT (appT (conT ''IO) t)
listIoReturn :: ReturnExpQ
listIoReturn = [| \v -> [return v] |]
listIoBind :: BindExpQ
listIoBind = [| \m -> \f -> concatMap (>>= f) m |]
liftIO :: NonProperMorphismExpQ
liftIO = [| \io -> [io] |]
merge :: NonProperMorphismExpQ
merge = [| concat |]
listIoBaseLift :: LiftExpQ
listIoBaseLift = [| map return |]