module Parser.Util where import AST (Expr) import Text.Megaparsec import Data.Void (Void) import Data.Text (Text) import Control.Monad.Reader (Reader) type Parser = ParsecT Void Text (Reader ParserData) newtype ParserData = ParserData { exprParser :: Parser (Expr SourceRange) } -- | Specifies start and end positions of a parsed expression. type SourceRange = (SourcePos, SourcePos) -- | Adds the source range to a parser. withSourceRange :: (MonadParsec e s m, TraversableStream s) => m (SourceRange -> a) -> m a withSourceRange parser = flip curry <$> getSourcePos <*> parser <*> getSourcePos