{-# LANGUAGE FlexibleContexts #-} module Language.SimpleShell.Parser.Name ( nameP , keyword ) where import Language.SimpleShell.Parser.Common.Lexeme (lexeme) import Control.Monad (void) import Data.Text (Text, cons) import Data.Char (isAlpha, isAlphaNum) import Text.Megaparsec (MonadParsec, takeWhileP, satisfy, notFollowedBy, try) import Text.Megaparsec.Char (string) isNameStartChar :: Char -> Bool isNameStartChar c = isAlpha c || c == '_' isNameChar :: Char -> Bool isNameChar c = isAlphaNum c || c == '_' nameP :: (MonadParsec e Text m) => m Text nameP = lexeme $ cons <$> satisfy isNameStartChar <*> takeWhileP Nothing isNameChar keyword :: (MonadParsec e Text m) => Text -> m () keyword kw = void $ lexeme $ try $ string kw <* notFollowedBy (satisfy isNameChar)