module Language.SimpleShell.Parser.Name ( nameP , keyword ) where import Language.SimpleShell.Parser (Parser, lexeme) import Control.Monad (void) import Data.Text (Text, cons) import Data.Char (isAlpha, isAlphaNum) import Text.Megaparsec (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 :: Parser Text nameP = lexeme $ cons <$> satisfy isNameStartChar <*> takeWhileP Nothing isNameChar keyword :: Text -> Parser () keyword kw = void $ lexeme $ try $ string kw <* notFollowedBy (satisfy isNameChar)