module Config.ParserUtils
( Parser
, runParser
, lexerP
, errorP
) where
import Control.Monad.Trans.Class (lift)
import Control.Monad.Trans.State.Strict (StateT, evalStateT, get, put)
#if !MIN_VERSION_base(4,8,0)
import Control.Applicative
#endif
newtype Parser t a = Parser (StateT [t] (Either t) a)
deriving (Functor, Applicative, Monad)
runParser :: Parser t a -> [t] -> Either t a
runParser (Parser m) = evalStateT m
lexerP :: Parser t t
lexerP = Parser $
do x:xs <- get
put xs
return x
errorP :: t -> Parser t a
errorP = Parser . lift . Left