module ParseLib.Abstract.Applications
  (
    -- * Applications of elementary parsers
    digit,
    newdigit,
    natural,
    integer,
    identifier,
    parenthesised,
    bracketed,
    braced,
    commaList,
    semiList
  )
  where

import Data.Char
import ParseLib.Abstract.Core
import ParseLib.Abstract.Derived

digit  :: Parser Char Char
digit :: Parser Char Char
digit  =  (Char -> Bool) -> Parser Char Char
forall s. (s -> Bool) -> Parser s s
satisfy Char -> Bool
isDigit

newdigit :: Parser Char Int
newdigit :: Parser Char Int
newdigit = String -> Int
forall a. Read a => String -> a
read (String -> Int) -> (Char -> String) -> Char -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> String -> String
forall a. a -> [a] -> [a]
:[]) (Char -> Int) -> Parser Char Char -> Parser Char Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Char Char
digit

natural :: Parser Char Int
natural :: Parser Char Int
natural = (Int -> Int -> Int) -> Int -> [Int] -> Int
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl (\ Int
a Int
b -> Int
a Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
10 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
b) Int
0 ([Int] -> Int) -> Parser Char [Int] -> Parser Char Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Char Int -> Parser Char [Int]
forall s a. Parser s a -> Parser s [a]
many1 Parser Char Int
newdigit

integer :: Parser Char Int
integer :: Parser Char Int
integer = ((Int -> Int) -> Char -> Int -> Int
forall a b. a -> b -> a
const Int -> Int
forall a. Num a => a -> a
negate (Char -> Int -> Int)
-> Parser Char Char -> Parser Char (Int -> Int)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Char -> Parser Char Char
forall s. Eq s => s -> Parser s s
symbol Char
'-')) Parser Char (Int -> Int)
-> (Int -> Int) -> Parser Char (Int -> Int)
forall s a. Parser s a -> a -> Parser s a
`option` Int -> Int
forall a. a -> a
id  Parser Char (Int -> Int) -> Parser Char Int -> Parser Char Int
forall a b. Parser Char (a -> b) -> Parser Char a -> Parser Char b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>  Parser Char Int
natural 

identifier :: Parser Char String
identifier :: Parser Char String
identifier = (:) (Char -> String -> String)
-> Parser Char Char -> Parser Char (String -> String)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Char -> Bool) -> Parser Char Char
forall s. (s -> Bool) -> Parser s s
satisfy Char -> Bool
isAlpha Parser Char (String -> String)
-> Parser Char String -> Parser Char String
forall a b. Parser Char (a -> b) -> Parser Char a -> Parser Char b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Char Char -> Parser Char String
forall s a. Parser s a -> Parser s [a]
greedy ((Char -> Bool) -> Parser Char Char
forall s. (s -> Bool) -> Parser s s
satisfy Char -> Bool
isAlphaNum)

parenthesised :: Parser Char a -> Parser Char a
parenthesised :: forall a. Parser Char a -> Parser Char a
parenthesised Parser Char a
p = Parser Char Char
-> Parser Char a -> Parser Char Char -> Parser Char a
forall s a b c.
Parser s a -> Parser s b -> Parser s c -> Parser s b
pack (Char -> Parser Char Char
forall s. Eq s => s -> Parser s s
symbol Char
'(') Parser Char a
p (Char -> Parser Char Char
forall s. Eq s => s -> Parser s s
symbol Char
')')

bracketed :: Parser Char a -> Parser Char a
bracketed :: forall a. Parser Char a -> Parser Char a
bracketed Parser Char a
p = Parser Char Char
-> Parser Char a -> Parser Char Char -> Parser Char a
forall s a b c.
Parser s a -> Parser s b -> Parser s c -> Parser s b
pack (Char -> Parser Char Char
forall s. Eq s => s -> Parser s s
symbol Char
'[') Parser Char a
p (Char -> Parser Char Char
forall s. Eq s => s -> Parser s s
symbol Char
']')

braced :: Parser Char a -> Parser Char a
braced :: forall a. Parser Char a -> Parser Char a
braced Parser Char a
p = Parser Char Char
-> Parser Char a -> Parser Char Char -> Parser Char a
forall s a b c.
Parser s a -> Parser s b -> Parser s c -> Parser s b
pack (Char -> Parser Char Char
forall s. Eq s => s -> Parser s s
symbol Char
'{') Parser Char a
p (Char -> Parser Char Char
forall s. Eq s => s -> Parser s s
symbol Char
'}')

commaList :: Parser Char a -> Parser Char [a]
commaList :: forall a. Parser Char a -> Parser Char [a]
commaList Parser Char a
p = Parser Char a -> Parser Char Char -> Parser Char [a]
forall s a b. Parser s a -> Parser s b -> Parser s [a]
listOf Parser Char a
p (Char -> Parser Char Char
forall s. Eq s => s -> Parser s s
symbol Char
',')

semiList :: Parser Char a -> Parser Char [a]
semiList :: forall a. Parser Char a -> Parser Char [a]
semiList Parser Char a
p = Parser Char a -> Parser Char Char -> Parser Char [a]
forall s a b. Parser s a -> Parser s b -> Parser s [a]
listOf Parser Char a
p (Char -> Parser Char Char
forall s. Eq s => s -> Parser s s
symbol Char
';')