module Domain.Attoparsec.General
where

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


only :: Parser Text a -> Parser Text a
only Parser Text a
parser =
  Parser ()
skipSpace forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text 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 Text a -> Parser Text [a]
commaSeparated Parser Text a
parser =
  forall (f :: * -> *) a s. Alternative f => f a -> f s -> f [a]
sepBy Parser Text a
parser Parser Text Char
comma

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

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

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

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

name :: (Char -> Bool) -> Parser Text Text
name Char -> Bool
firstCharPred =
  do
    Char
a <- (Char -> Bool) -> Parser Text Char
satisfy Char -> Bool
firstCharPred
    Text
b <- (Char -> Bool) -> Parser Text 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 Text
ucName =
  (Char -> Bool) -> Parser Text Text
name Char -> Bool
isUpper

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