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 :: forall a. Parser a -> Parser a
only Parser a
parser =
  Parser ()
skipSpace forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser a
parser forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
skipSpace forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall t. Chunk t => Parser t ()
endOfInput

commaSeparated :: Parser a -> Parser [a]
commaSeparated :: forall a. Parser a -> Parser [a]
commaSeparated Parser a
parser =
  forall (f :: * -> *) a s. Alternative f => f a -> f s -> f [a]
sepBy Parser a
parser Parser Char
comma

comma :: Parser Char
comma :: Parser Char
comma =
  Parser ()
skipSpace forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> Parser Char
char Char
',' forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
skipSpace

inParens :: Parser b -> Parser b
inParens :: forall a. Parser a -> Parser a
inParens Parser b
parser =
  do
    Char -> Parser Char
char Char
'('
    Parser ()
skipSpace
    b
a <- Parser b
parser
    Parser ()
skipSpace
    Char -> Parser Char
char Char
')'
    forall (m :: * -> *) a. Monad m => a -> m a
return b
a

inSquareBrackets :: Parser b -> Parser b
inSquareBrackets :: forall a. Parser a -> Parser a
inSquareBrackets Parser b
parser =
  do
    Char -> Parser Char
char Char
'['
    Parser ()
skipSpace
    b
a <- Parser b
parser
    Parser ()
skipSpace
    Char -> Parser Char
char Char
']'
    forall (m :: * -> *) a. Monad m => a -> m a
return b
a

skipSpace1 :: Parser ()
skipSpace1 :: Parser ()
skipSpace1 =
  Parser Char
space forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
skipSpace

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

ucName :: Parser Text
ucName :: Parser Text
ucName =
  (Char -> Bool) -> Parser Text
name Char -> Bool
isUpper

lcName :: Parser Text
lcName :: Parser Text
lcName =
  (Char -> Bool) -> Parser Text
name (\Char
a -> Char -> Bool
isLower Char
a Bool -> Bool -> Bool
|| Char
a forall a. Eq a => a -> a -> Bool
== Char
'_')