trifecta-0.42: Text/Trifecta/Parser/Token/Class.hs
-----------------------------------------------------------------------------
-- |
-- Module : Text.Trifecta.Parser.Token.Class
-- Copyright : (c) Edward Kmett 2011
-- License : BSD3
--
-- Maintainer : ekmett@gmail.com
-- Stability : experimental
-- Portability : non-portable
--
-----------------------------------------------------------------------------
module Text.Trifecta.Parser.Token.Class
( MonadTokenParser(..)
) where
import Control.Applicative
import Control.Monad.Trans.Class
import Control.Monad.Trans.State.Lazy as Lazy
import Control.Monad.Trans.State.Strict as Strict
import Control.Monad.Trans.Writer.Lazy as Lazy
import Control.Monad.Trans.Writer.Strict as Strict
import Control.Monad.Trans.RWS.Lazy as Lazy
import Control.Monad.Trans.RWS.Strict as Strict
import Control.Monad.Trans.Reader
import Control.Monad.Trans.Identity
import Data.Monoid
import Text.Trifecta.Parser.Class
class MonadParser m => MonadTokenParser m where
-- | Parses any white space. White space consists of /zero/ or more
-- occurrences of a 'space', a line comment or a block (multi
-- line) comment. Block comments may be nested. How comments are
-- started and ended is defined by this method.
whiteSpace :: m ()
-- | Called when we enter a nested pair of symbols. Used to disable
-- layout or highlight nested contexts.
nesting :: m a -> m a
-- | Lexeme parser |semi| parses the character \';\' and skips any
-- trailing white space. Returns the character \';\'.‗
semi :: m Char
instance MonadTokenParser m => MonadTokenParser (ReaderT r m) where
whiteSpace = lift whiteSpace
nesting (ReaderT m) = ReaderT $ \r -> nesting (m r)
semi = lift semi
instance MonadTokenParser m => MonadTokenParser (Lazy.StateT s m) where
whiteSpace = lift whiteSpace
nesting (Lazy.StateT m) = Lazy.StateT $ \s -> nesting (m s)
semi = lift semi
instance MonadTokenParser m => MonadTokenParser (Strict.StateT s m) where
whiteSpace = lift whiteSpace
nesting (Strict.StateT m) = Strict.StateT $ \s -> nesting (m s)
semi = lift semi
instance (MonadTokenParser m, Monoid w) => MonadTokenParser (Lazy.WriterT w m) where
whiteSpace = lift whiteSpace
nesting (Lazy.WriterT m) = Lazy.WriterT $ nesting m
semi = lift semi
instance (MonadTokenParser m, Monoid w) => MonadTokenParser (Strict.WriterT w m) where
whiteSpace = lift whiteSpace
nesting (Strict.WriterT m) = Strict.WriterT $ nesting m
semi = lift semi
instance (MonadTokenParser m, Monoid w) => MonadTokenParser (Lazy.RWST r w s m) where
whiteSpace = lift whiteSpace
nesting (Lazy.RWST m) = Lazy.RWST $ \r s -> nesting (m r s)
semi = lift semi
instance (MonadTokenParser m, Monoid w) => MonadTokenParser (Strict.RWST r w s m) where
whiteSpace = lift whiteSpace
nesting (Strict.RWST m) = Strict.RWST $ \r s -> nesting (m r s)
semi = lift semi
instance MonadTokenParser m => MonadTokenParser (IdentityT m) where
whiteSpace = lift whiteSpace
nesting (IdentityT m) = IdentityT (nesting m)
semi = lift semi