module Parsers.String where

import Parser (Parser)
import ParserCombinators (IsMatch(..), (|*), (|+), (|?), (>>>), within, withinBoth)
import Parsers.Char (char, digit, upper, lower, letter, alpha, alphaNum,
                     space, tab, spaceOrTab, whiteSpace, newLine, quote,
                     doubleQuote, openParens, closeParens, openSquare,
                     closeSquare, openCurly, closeCurly, openAngle, closeAngle)


string :: Parser String
string :: Parser String
string = (Parser Char
char Parser Char -> Parser String
forall a. Parser a -> Parser [a]
|*)

word :: Parser String
word :: Parser String
word = (Parser Char -> Parser Char
forall a. IsMatch a => Parser a -> Parser a
inverse Parser Char
whiteSpace Parser Char -> Parser String
forall a. Parser a -> Parser [a]
|+)

digits :: Parser String
digits :: Parser String
digits = (Parser Char
digit Parser Char -> Parser String
forall a. Parser a -> Parser [a]
|+)

uppers :: Parser String
uppers :: Parser String
uppers = (Parser Char
upper Parser Char -> Parser String
forall a. Parser a -> Parser [a]
|+)

lowers :: Parser String
lowers :: Parser String
lowers = (Parser Char
lower Parser Char -> Parser String
forall a. Parser a -> Parser [a]
|+)

letters :: Parser String
letters :: Parser String
letters = (Parser Char
letter Parser Char -> Parser String
forall a. Parser a -> Parser [a]
|+)

alphas :: Parser String
alphas :: Parser String
alphas = (Parser Char
alpha Parser Char -> Parser String
forall a. Parser a -> Parser [a]
|+)

alphaNums :: Parser String
alphaNums :: Parser String
alphaNums = (Parser Char
alphaNum Parser Char -> Parser String
forall a. Parser a -> Parser [a]
|+)



spaces :: Parser String
spaces :: Parser String
spaces = (Parser Char
space Parser Char -> Parser String
forall a. Parser a -> Parser [a]
|+)

tabs :: Parser String
tabs :: Parser String
tabs = (Parser Char
tab Parser Char -> Parser String
forall a. Parser a -> Parser [a]
|+)

newLines :: Parser String
newLines :: Parser String
newLines = (Parser Char
newLine Parser Char -> Parser String
forall a. Parser a -> Parser [a]
|+)

spacesOrTabs :: Parser String
spacesOrTabs :: Parser String
spacesOrTabs = (Parser Char
spaceOrTab Parser Char -> Parser String
forall a. Parser a -> Parser [a]
|+)

spacing :: Parser String
spacing :: Parser String
spacing = (Parser Char
whiteSpace Parser Char -> Parser String
forall a. Parser a -> Parser [a]
|+)

blankLine :: Parser String
blankLine :: Parser String
blankLine = (Parser String
spacesOrTabs Parser String -> Parser (Maybe String)
forall a. Parser a -> Parser (Maybe a)
|?) Parser (Maybe String) -> Parser Char -> Parser String
forall a b.
(ToString a, ToString b) =>
Parser a -> Parser b -> Parser String
>>> Parser Char
newLine

blankLines :: Parser String
blankLines :: Parser String
blankLines = [String] -> String
forall a. Monoid a => [a] -> a
mconcat ([String] -> String) -> Parser [String] -> Parser String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Parser String
blankLine Parser String -> Parser [String]
forall a. Parser a -> Parser [a]
|+)



withinQuotes :: Parser b -> Parser b
withinQuotes :: Parser b -> Parser b
withinQuotes = Parser Char -> Parser b -> Parser b
forall a b. Parser a -> Parser b -> Parser b
within Parser Char
quote

withinDoubleQuotes :: Parser b -> Parser b
withinDoubleQuotes :: Parser b -> Parser b
withinDoubleQuotes = Parser Char -> Parser b -> Parser b
forall a b. Parser a -> Parser b -> Parser b
within Parser Char
doubleQuote

withinParens :: Parser b -> Parser b
withinParens :: Parser b -> Parser b
withinParens = Parser Char -> Parser Char -> Parser b -> Parser b
forall a b c. Parser a -> Parser b -> Parser c -> Parser c
withinBoth Parser Char
openParens Parser Char
closeParens

withinSquareBrackets :: Parser b -> Parser b
withinSquareBrackets :: Parser b -> Parser b
withinSquareBrackets = Parser Char -> Parser Char -> Parser b -> Parser b
forall a b c. Parser a -> Parser b -> Parser c -> Parser c
withinBoth Parser Char
openSquare Parser Char
closeSquare

withinCurlyBrackets :: Parser b -> Parser b
withinCurlyBrackets :: Parser b -> Parser b
withinCurlyBrackets = Parser Char -> Parser Char -> Parser b -> Parser b
forall a b c. Parser a -> Parser b -> Parser c -> Parser c
withinBoth Parser Char
openCurly Parser Char
closeCurly

withinAngleBrackets :: Parser b -> Parser b
withinAngleBrackets :: Parser b -> Parser b
withinAngleBrackets = Parser Char -> Parser Char -> Parser b -> Parser b
forall a b c. Parser a -> Parser b -> Parser c -> Parser c
withinBoth Parser Char
openAngle Parser Char
closeAngle