packages feed

domain-0.1.1.5: library/Domain/Attoparsec/General.hs

module Domain.Attoparsec.General where

import Data.Attoparsec.Text
import qualified Data.Text as Text
import Domain.Prelude hiding (takeWhile)

only :: Parser a -> Parser a
only parser =
  skipSpace *> parser <* skipSpace <* endOfInput

commaSeparated :: Parser a -> Parser [a]
commaSeparated parser =
  sepBy parser comma

comma :: Parser Char
comma =
  skipSpace *> char ',' <* skipSpace

inParens :: Parser b -> Parser b
inParens parser =
  do
    char '('
    skipSpace
    a <- parser
    skipSpace
    char ')'
    return a

inSquareBrackets :: Parser b -> Parser b
inSquareBrackets parser =
  do
    char '['
    skipSpace
    a <- parser
    skipSpace
    char ']'
    return a

skipSpace1 :: Parser ()
skipSpace1 =
  space *> skipSpace

name :: (Char -> Bool) -> Parser Text
name firstCharPred =
  do
    a <- satisfy firstCharPred
    b <- takeWhile (\a -> isAlphaNum a || a == '\'' || a == '_')
    return (Text.cons a b)

ucName :: Parser Text
ucName =
  name isUpper

lcName :: Parser Text
lcName =
  name (\a -> isLower a || a == '_')