{-# LANGUAGE MultiParamTypeClasses #-} module Text.Trifecta.Parser.Layout.Class ( MonadLayout(..) ) where import Data.Monoid import Control.Monad.Trans.Class import Control.Monad.Trans.Reader import Control.Monad.Trans.Identity import qualified Control.Monad.Trans.State.Lazy as Lazy import qualified Control.Monad.Trans.State.Strict as Strict import qualified Control.Monad.Trans.Writer.Lazy as Lazy import qualified Control.Monad.Trans.Writer.Strict as Strict import qualified Control.Monad.Trans.RWS.Lazy as Lazy import qualified Control.Monad.Trans.RWS.Strict as Strict import Text.Trifecta.Parser.Layout.Prim import Text.Trifecta.Parser.Class class MonadParser m => MonadLayout m where layout :: m LayoutToken layoutState :: (LayoutState -> (a, LayoutState)) -> m a instance MonadLayout m => MonadLayout (Strict.StateT s m) where layout = lift layout layoutState = lift . layoutState instance MonadLayout m => MonadLayout (Lazy.StateT s m) where layout = lift layout layoutState = lift . layoutState instance MonadLayout m => MonadLayout (ReaderT e m) where layout = lift layout layoutState = lift . layoutState instance (Monoid w, MonadLayout m) => MonadLayout (Strict.WriterT w m) where layout = lift layout layoutState = lift . layoutState instance (Monoid w, MonadLayout m) => MonadLayout (Lazy.WriterT w m) where layout = lift layout layoutState = lift . layoutState instance (Monoid w, MonadLayout m) => MonadLayout (Strict.RWST r w s m) where layout = lift layout layoutState = lift . layoutState instance (Monoid w, MonadLayout m) => MonadLayout (Lazy.RWST r w s m) where layout = lift layout layoutState = lift . layoutState instance MonadLayout m => MonadLayout (IdentityT m) where layout = lift layout layoutState = lift . layoutState