packages feed

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 -"