algebraic-graphs-io-0.4: src/Algebra/Graph/IO/Internal/Megaparsec.hs
{-# language OverloadedStrings #-}
{-# options_ghc -Wno-unused-imports #-}
module Algebra.Graph.IO.Internal.Megaparsec (Parser, ParserT, ParseE,
-- * Internal
lexeme, symbol, anyString, alphaNum
) where
import Control.Applicative hiding (many, some)
import Data.Char (isAlpha, isSpace, isAlphaNum)
import Data.Void (Void)
-- megaparsec
import Text.Megaparsec (Parsec, ParsecT, parseTest, satisfy, (<?>))
import Text.Megaparsec.Char (space1)
import Text.Megaparsec.Error (ParseErrorBundle)
import qualified Text.Megaparsec.Char.Lexer as L
-- parser-combinators
import Control.Monad.Combinators (many, some, between)
-- text
import Data.Text (Text)
type Parser = Parsec Void Text
type ParserT = ParsecT Void Text
type ParseE = ParseErrorBundle Text Void
lexeme :: Parser a -- ^ disregard any whitespace around this parser
-> Parser a
lexeme = L.lexeme sc
-- | Match a string
symbol :: Text
-> Parser Text
symbol = L.symbol sc
-- | space consumer
sc :: Parser ()
sc = L.space
space1
(L.skipLineComment "//")
(L.skipBlockComment "/*" "*/")
anyString, alphaNum :: Parser String
anyString = many (satisfy isAlpha)
alphaNum = many (satisfy $ \c -> isAlphaNum c || c `elem` ['-', '_']) <?> "alphanumeric string or -"