{-# LANGUAGE TemplateHaskell #-}

module MonadLab.Io (
   ioMonad
 ) where

import Prelude hiding (Monad)
import Language.Haskell.TH
import MonadLab.CommonTypes

ioMonad :: Monad
ioMonad = (ioTypeCon , ioReturn , ioBind, [(Io, [liftIO])], ioBaseLift)

ioTypeCon :: MonadTypeCon
ioTypeCon = \t -> appT (conT ''IO) t 

ioReturn :: ReturnExpQ
ioReturn = [| return |]

ioBind :: BindExpQ
ioBind = [| (>>=) |]

liftIO :: NonProperMorphismExpQ
liftIO = [| id |]

ioBaseLift :: LiftExpQ
ioBaseLift = [| id |]